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 Disk Data с двумя столбцами, используя следующее выражение 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 с дискового на кэшируемое, добавьте в определение столбца в операторе ALTER
TABLE указание STORAGE MEMORY, как показано ниже:
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 использует дисковое хранилище, так как это значение по умолчанию для таблицы (определяется в CREATE TABLE операторе в разделе таблицы STORAGE DISK). Однако, столбец 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= перед valueALTER 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.