Spec-Zone.ru › MySQL 9.2

15.1.9.3 Примеры ALTER TABLE

Начните с таблицы t1, созданной, как показано здесь:

CREATE TABLE t1 (a INTEGER, b CHAR(10));

Чтобы переименовать таблицу из t1 в t2:

ALTER TABLE t1 RENAME t2;

Чтобы изменить столбец a с INTEGER на TINYINT NOT NULL (оставив то же имя) и изменить столбец b с CHAR(10) на CHAR(20), а также переименовать его из b в c:

ALTER TABLE t2 MODIFY a TINYINT NOT NULL, CHANGE b c CHAR(20);

Чтобы добавить новый TIMESTAMP столбец с именем d:

ALTER TABLE t2 ADD d TIMESTAMP;

Чтобы добавить индекс к столбцу d и UNIQUE индекс к столбцу a:

ALTER TABLE t2 ADD INDEX (d), ADD UNIQUE (a);

Чтобы удалить столбец c:

ALTER TABLE t2 DROP COLUMN c;

Чтобы добавить новый столбец целых чисел AUTO_INCREMENT с именем c:

ALTER TABLE t2 ADD c INT UNSIGNED NOT NULL AUTO_INCREMENT,
  ADD PRIMARY KEY (c);

Мы индексировали c (как PRIMARY KEY), потому что столбцы AUTO_INCREMENT должны быть индексированы, и мы объявляем c как NOT NULL, потому что столбцы первичного ключа не могут быть NULL.

Для таблиц NDB также можно изменить тип хранения, используемый для таблицы или столбца. Например, рассмотрим таблицу NDB, созданную, как показано здесь:

mysql> CREATE TABLE t1 (c1 INT) TABLESPACE ts_1 ENGINE NDB;
Query OK, 0 rows affected (1.27 sec)

Чтобы преобразовать эту таблицу в хранилище на диске, можно использовать следующее утверждение ALTER TABLE:

mysql> ALTER TABLE t1 TABLESPACE ts_1 STORAGE DISK;
Query OK, 0 rows affected (2.99 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SHOW CREATE TABLE t1\G
*************************** 1. row ***************************
       Table: t1
Create Table: CREATE TABLE `t1` (
  `c1` int(11) DEFAULT NULL
) /*!50100 TABLESPACE ts_1 STORAGE DISK */
ENGINE=ndbcluster DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.01 sec)

При первоначальном создании таблицы не обязательно было ссылаться на пространство таблиц; однако пространство таблиц должно быть указано в ALTER TABLE:

mysql> CREATE TABLE t2 (c1 INT) ts_1 ENGINE NDB;
Query OK, 0 rows affected (1.00 sec)

mysql> ALTER TABLE t2 STORAGE DISK;
ERROR 1005 (HY000): Can't create table 'c.#sql-1750_3' (errno: 140)
mysql> ALTER TABLE t2 TABLESPACE ts_1 STORAGE DISK;
Query OK, 0 rows affected (3.42 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> SHOW CREATE TABLE t2\G
*************************** 1. row ***************************
       Table: t1
Create Table: CREATE TABLE `t2` (
  `c1` int(11) DEFAULT NULL
) /*!50100 TABLESPACE ts_1 STORAGE DISK */
ENGINE=ndbcluster DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.01 sec)

Чтобы изменить тип хранения отдельного столбца, можно использовать ALTER TABLE ... MODIFY [COLUMN]. Например, предположим, что вы создаете таблицу данных на диске NDB Cluster с двумя столбцами, используя это CREATE TABLE утверждение:

mysql> CREATE TABLE t3 (c1 INT, c2 INT)
    ->     TABLESPACE ts_1 STORAGE DISK ENGINE NDB;
Query OK, 0 rows affected (1.34 sec)

Чтобы изменить столбец c2 с хранения на диске на хранение в оперативной памяти, включите предложение STORAGE MEMORY в определение столбца, используемое в ALTER TABLE предложении, как показано здесь:

mysql> ALTER TABLE t3 MODIFY c2 INT STORAGE MEMORY;
Query OK, 0 rows affected (3.14 sec)
Records: 0  Duplicates: 0  Warnings: 0

Вы можете преобразовать столбец оперативной памяти в столбец на диске, используя STORAGE DISK аналогичным образом.

Столбец c1 использует хранение на диске, поскольку это значение по умолчанию для таблицы (определяется предложением STORAGE DISK на уровне таблицы в CREATE TABLE предложении). Однако столбец c2 использует хранение в оперативной памяти, как можно увидеть здесь в результатах работы SHOW CREATE TABLE:

mysql> SHOW CREATE TABLE t3\G
*************************** 1. row ***************************
       Table: t3
Create Table: CREATE TABLE `t3` (
  `c1` int(11) DEFAULT NULL,
  `c2` int(11) /*!50120 STORAGE MEMORY */ DEFAULT NULL
) /*!50100 TABLESPACE ts_1 STORAGE DISK */ ENGINE=ndbcluster DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.02 sec)

При добавлении столбца AUTO_INCREMENT значения столбца автоматически заполняются порядковыми номерами. Для таблиц MyISAM можно установить первый порядковый номер, выполнив SET INSERT_ID=value перед ALTER TABLE или используя параметр таблицы AUTO_INCREMENT=value.

Для таблиц MyISAM, если вы не изменяете столбец AUTO_INCREMENT, порядковый номер не изменится. Если вы удалите столбец AUTO_INCREMENT, а затем добавите другой столбец AUTO_INCREMENT, номера пересчитываются, начиная с 1.

При использовании репликации добавление столбца AUTO_INCREMENT в таблицу может не привести к одинаковому порядку строк на реплике и источнике. Это происходит потому, что порядок нумерации строк зависит от конкретного движка хранилища, используемого для таблицы, и порядка вставки строк. Если важно иметь одинаковый порядок на источнике и реплике, строки должны быть упорядочены перед назначением порядкового номера AUTO_INCREMENT. Предполагая, что вы хотите добавить столбец AUTO_INCREMENT в таблицу t1, следующие утверждения создают новую таблицу t2, идентичную t1, но со столбцом AUTO_INCREMENT:

CREATE TABLE t2 (id INT AUTO_INCREMENT PRIMARY KEY)
SELECT * FROM t1 ORDER BY col1, col2;

Это предполагает, что таблица t1 имеет столбцы col1 и col2.

Этот набор утверждений также создает новую таблицу t2, идентичную t1, с добавлением столбца AUTO_INCREMENT:

CREATE TABLE t2 LIKE t1;
ALTER TABLE t2 ADD id INT AUTO_INCREMENT PRIMARY KEY;
INSERT INTO t2 SELECT * FROM t1 ORDER BY col1, col2;
Важно

Для обеспечения одинакового порядка как на источнике, так и на реплике, все столбцы t1 должны быть указаны в предложении ORDER BY.

Независимо от метода создания и заполнения копии со столбцом AUTO_INCREMENT, последним шагом является удаление исходной таблицы и переименование копии:

DROP TABLE t1;
ALTER TABLE t2 RENAME t1;

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-9.2-en/alter-table-examples.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API