13.1.8.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=latin1
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=latin1
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=latin1
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.