webew
Войти » Регистрация
 
MySQL

Синтаксис оператора ALTER TABLE

3 октября 2009, 14:53
Автор: Василий Лукьянчиков [vasya]

Данная статья является свободным переводом официальной документации MySQL версии 5.0.

Синтаксис оператора ALTER TABLE

ALTER [IGNORE] TABLE tbl_name
    alter_specification [, alter_specification] ...

alter_specification:
    table_option ...
  | ADD [COLUMN] col_name column_definition
        [FIRST | AFTER col_name ]
  | ADD [COLUMN] (col_name column_definition,...)
  | ADD {INDEX|KEY} [index_name]
        [index_type] (index_col_name,...) [index_type]
  | ADD [CONSTRAINT [symbol]] PRIMARY KEY
        [index_type] (index_col_name,...) [index_type]
  | ADD [CONSTRAINT [symbol]]
        UNIQUE [INDEX|KEY] [index_name]
        [index_type] (index_col_name,...) [index_type]
  | ADD [FULLTEXT|SPATIAL] [INDEX|KEY] [index_name]
        (index_col_name,...) [index_type]
  | ADD [CONSTRAINT [symbol]]
        FOREIGN KEY [index_name] (index_col_name,...)
        reference_definition
  | ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
  | CHANGE [COLUMN] old_col_name new_col_name column_definition
        [FIRST|AFTER col_name]
  | MODIFY [COLUMN] col_name column_definition
        [FIRST | AFTER col_name]
  | DROP [COLUMN] col_name
  | DROP PRIMARY KEY
  | DROP {INDEX|KEY} index_name
  | DROP FOREIGN KEY fk_symbol
  | DISABLE KEYS
  | ENABLE KEYS
  | RENAME [TO] new_tbl_name
  | ORDER BY col_name [, col_name] ...
  | CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]
  | [DEFAULT] CHARACTER SET [=] charset_name [COLLATE [=] collation_name]
  | DISCARD TABLESPACE
  | IMPORT TABLESPACE

index_col_name:
    col_name [(length)] [ASC | DESC]

index_type:
    USING {BTREE | HASH | RTREE}

Оператор ALTER TABLE позволяет изменять структуру существующей таблицы. Например, вы можете добавлять или удалять колонки, изменять тип существующих колонок, переименовывать колонки, или саму таблицу. Также можно изменить комментарий к таблице и тип таблицы.

Синтаксис оператора ALTER TABLE во многих случаях подобен синтаксису CREATE TABLE. Для получения подробной информации см. раздел 11.1.5, "CREATE TABLE Syntax".

Некоторые операции могут вызвать предупреждения, если совершать их над таблицей, механизм хранения которой не поддерживает такие операции. Эти предупреждения можно просмотреть с помощью оператора SHOW WARNINGS. См. раздел 11.5.4.28, "SHOW WARNINGS Syntax"

Если вы используете оператор ALTER TABLE для изменения колонки, но оператор DESCRIBE tbl_name показывает, что ваша колонка осталась неизменной, то возможно, что сервер MySQL проигнорировал ваши изменения по одной из причин, описанных в разделе 11.1.5.1, "Silent Column Specification Changes"

В большинстве случаев оператор ALTER TABLE работает, создавая временную копию исходной таблицы. Изменения осуществляются на копии, затем исходная таблица удаляется и новая переименовывается. Пока оператор ALTER TABLE выполняется, исходная таблица остается доступной для чтения другим клиентам. Обновление и запись данных в таблицу задерживаются до тех пор пока новая таблица не будет готова, и затем автоматически направляются к новой таблице без каких-либо уведомлений о неудавшихся изменениях. Временная таблица создается в директории базы данных новой таблицы. Она может отличаться от директории базы данных исходной таблицы, если оператор ALTER TABLE с помощью переименования таблицы переносит её в другую базу данных.

Если вы используете оператор ALTER TABLE tbl_name RENAME TO new_tbl_name без каких-либо других опций, MySQL просто переименует файлы, относящиеся к таблице tbl_name. (Для переименования таблиц вы также можете использовать оператор RENAME TABLE. См. раздел 11.1.9, "RENAME TABLE Syntax".) Права доступа пользователей, относящиеся именно к переименованной таблице, не перенесутся на новое имя. Они должны быть изменены вручную с помощью операторов GRANT и REVOKE.

Если вы используете оператор ALTER TABLE с любыми отличными от RENAME опциями, MySQL всегда создает временную таблицу даже если данные заведомо не требуется копировать (например, когда меняется название колонки). Для таблиц типа MyISAM вы можете ускорить пересоздание индексов (это самая медленная часть в процессе изменения) установкой для системной переменной myisam_sort_buffer_size большей величины.

Информацию о возможных проблемах при использовании оператора ALTER TABLE см. в разделе B.1.7.1. "Problems with ALTER TABLE".

Используя mysql_info() C API функции, вы можете определить сколько строк было скопировано и (в случае использования ключевого слова IGNORE) сколько строк было удалено вследствии дублирования уникального ключа. См. раздел 20.9.3.35, “mysql_info()”.

Ниже приведены примеры, иллюстрирующие использование оператора 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);

Для добавления новой колонки d типа TIMESTAMP:

ALTER TABLE t2 ADD d TIMESTAMP;

Для добавления индекса на колонку d и уникального индекса на колонку 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 первичным ключом, так как в таблице может быть только одна AUTO_INCREMENT колонка и она должна быть ключом. Вследствии того, что первичный ключ не может принимать NULL значения, мы определили колонку с как NOT NULL.

При добавлении AUTO_INCREMENT колонки она автоматически заполняется последовательными значениями целых чисел. Для MyISAM-таблиц можно указать величину первого значения, выполнив команду SET INSERT_ID=value перед оператором ALTER TABLE или используя табличную опцию AUTO_INCREMENT=value. См. раздел 5.1.4, “Session System Variables”.

В случае MyISAM-таблиц если не происходит смены AUTO_INCREMENT колонки нумерация чисел не меняется. Если сначала удалить AUTO_INCREMENT колонку, а затем создать новую AUTO_INCREMENT колонку, то её заполнение начнется с единицы.

При использовании репликации добавление AUTO_INCREMENT колонки не гарантирует одинаковый порядок строк на мастере и slave. Это поисходит вследствии того, что порядок нумерации строк зависит от особенностей механизма хранения используемого для таблицы и того в каком порядке были добавлены строки в таблицу. Если важно иметь одинаковый порядок строк на мастере и slave, строки должны быть упорядочены до назначения 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;
Обратите внимание
Для гарантии одинакового порядка строк на мастере и slave все колонки таблицы t1 должны быть перечислены в части ORDER BY.

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

DROP t1;
ALTER TABLE t2 RENAME t1;

Права на оригинал на английском языке принадлежат MySQL AB. Автор перевода: Василий Лукьянчиков [vasya].
Добавить комментарий
© 2007—2012 webew.ru, связаться: x собака webew.ru
Сайт использует Flede и соответствует стандартам WAI-WCAG 1.0 на уровне A.
Rambler's Top100