Spec-Zone.ru › MySQL 8.4

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=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-8.4-en/alter-table-examples.html

Spec-Zone.ru

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