Date: Mon, 23 Oct 2000 12:18:57 +0400 (MSD)
From: MailList: Perl в примерах
Subject: SQL - Изменение структуры таблицы (ALTER, DROP, RENAME)
Perl и MySQL в примерах
Эту и другие статьи читайте на http://properl.com
В нашем форуме вы получите ответы на любые вопросы по теме
Perl, CGI и баз данных.
-----------------------------------------------------------
Изменение структуры существующей таблицы
ALTER [IGNORE] TABLE название_таблицы изменения [, изменения ...]
изменения:
ADD [COLUMN] определение_поля [FIRST | AFTER название_поля ]
или ADD [COLUMN] (определение_поля, определение_поля,...)
или ADD INDEX [название_индекса] (индексированное_поле,...)
или ADD PRIMARY KEY (индексированное_поле,...)
или ADD UNIQUE [название_индекса] (индексированное_поле,...)
или ADD FULLTEXT [название_индекса] (индексированное_поле,...)
или ALTER [COLUMN] название_поля
{SET DEFAULT значение_по_умолчанию | DROP DEFAULT}
или CHANGE [COLUMN] старое_поле определение_поля
или MODIFY [COLUMN] определение_поля
или DROP [COLUMN] название_поля
или DROP PRIMARY KEY
или DROP INDEX название_индекса
или RENAME [TO] новая_таблица
или свойства_таблицы
ALTER TABLE позволяет менять структуру существующей
таблицы. Можно добавлять и удалять поля, индексы, изменять
типы полей, переименовывать поля и таблицы, изменять
свойства таблиц.
ALTER TABLE создает временную таблицу, производит в ней
изменения, затем удаляет старую таблицу и переименовыват
временную. Во время работы ALTER TABLE клиенты могут
читать изменяемую таблицу. Все изменения и добавления
записей приостанавливаются пока операция не будет
завершена.
Если указана опция IGNORE, то при возникновении
повторяющихся записей в полях с уникальным индексом будет
использована только первая запись, остальные будут
удалены. В противном случае операция будет остановлена.
определение_поля имеет такой же синтаксис как и для
CREATE TABLE.
При помощи выражения CHANGE старое_поле определение_поля
можно переименовывать поля. Например, поле a будет
переименовано в b:
mysql> ALTER TABLE t1 CHANGE a b INTEGER;
Если вы хотите изменить тип поля, но не название, это
можно сделать одной из следующих команд:
mysql> ALTER TABLE t1 CHANGE b b BIGINT NOT NULL;
mysql> ALTER TABLE t1 MODIFY b BIGINT NOT NULL;
ADD ... FIRST | AFTER название_поля добавляет поле в
начало или в указанную позицию в структуре таблицы. По
умолчанию поле добавляется в конец.
ALTER COLUMN указывает новое значение по умолчанию для
поля или удаляет старое.
DROP удаляет поле. Это поле также удаляется из всех
индексов, частью которых оно является.
DROP INDEX удаляет индекс.
DROP PRIMARY KEY удаляет первичный индекс. Если первичного
индекса не существует, удаляется первый UNIQUE индекс в
таблице.
Вот несколько примеров использования ALTER TABLE.
Для начала создадим таблицу t1:
mysql> CREATE TABLE t1 (a INTEGER,b CHAR(10));
Теперь переименуем ее в t2:
mysql> ALTER TABLE t1 RENAME t2;
Изменяем тип поля a на TINYINT NOT NULL, а поле b заменим
на c CHAR(20):
mysql> ALTER TABLE t2 MODIFY a TINYINT NOT NULL,
CHANGE b c CHAR(20);
Добавим поле d TIMESTAMP:
mysql> ALTER TABLE t2 ADD d TIMESTAMP;
Добавим индекс для поля d, и сделаем его первичным ключем:
mysql> ALTER TABLE t2 ADD INDEX (d), ADD PRIMARY KEY (a);
Удалим поле c:
mysql> ALTER TABLE t2 DROP COLUMN c;
Добавим новое AUTO_INCREMENT поле c типа INT:
mysql> ALTER TABLE t2
ADD c INT UNSIGNED NOT NULL AUTO_INCREMENT,
ADD INDEX (c);
Удаление таблицы
DROP TABLE [IF EXISTS] название_таблицы
[, название_таблицы,...]
DROP TABLE удаляет таблицы вместе со всеми данными.
IF EXISTS предотвращает ошибку если таблица не существует.
Изменение названия таблицы
RENAME TABLE переименовывает таблицы.
RENAME TABLE название_таблицы TO новое_название_таблицы
[, название_таблицы2 TO новое_название_таблицы2,...]
Чтобы заменить таблицу пустой:
CREATE TABLE new_table (...);
RENAME TABLE old_table TO backup_table,
new_table TO old_table;
Чтобы поменять имена таблиц:
RENAME TABLE old_table TO backup_table,
new_table TO old_table,
backup_table TO old_table;
Если во время выполнения этой команды произойдет ошибка,
всем таблицам вернутся их прежние имена.
Чтобы переместить таблицу из одной базы данных в другую:
RENAME TABLE current_database.table_name
TO other_database.table_name;