Spec-Zone .ru
спецификации, руководства, описания, API

13.1.7.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 и a 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 (как a 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: 0mysql> SHOW CREATE TABLE t1\G*************************** 1. row ***************************       Table: t1Create Table: CREATE TABLE `t1` (  `c1` int(11) DEFAULT NULL) /*!50100 TABLESPACE ts_1 STORAGE DISK */ENGINE=ndbcluster DEFAULT CHARSET=latin11 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: 0mysql> SHOW CREATE TABLE t2\G*************************** 1. row ***************************       Table: t1Create Table: CREATE TABLE `t2` (  `c1` int(11) DEFAULT NULL) /*!50100 TABLESPACE ts_1 STORAGE DISK */ENGINE=ndbcluster DEFAULT CHARSET=latin11 row in set (0.01 sec)

Чтобы изменить тип хранения отдельного столбца, можно использовать ALTER TABLE ... MODIFY [COLUMN]. Например, предположите, что Вы создаете MySQL Cluster Disk Data table с двумя столбцами, используя это 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, как показано здесь:

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 память использования, как может быть замечен здесь в выводе ШОУ CREATE TABLE:

mysql> SHOW CREATE TABLE t3\G*************************** 1. row ***************************       Table: t3Create 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=latin11 row in set (0.02 sec)

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

С 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 t1;ALTER TABLE t2 RENAME t1;