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

Синтаксис оператора 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 < INDEXKEY >[ index_name ] [ index_type ] ( index_col_name. ) [ index_type ] ADD [ CONSTRAINT [ symbol ] ] PRIMARY KEY [ index_type ] ( index_col_name. ) [ index_type ] ADD [ CONSTRAINT [символ] ] УНІКАЛЬНИЙ [ КЛЮЧ ІНДЕКСУ ] [ ім’я_індексу ] [ тип_індексу ] ( ім’я_стовпця індексу. ) [ тип_індексу ] ДОДАТИ [ ПОВНИЙ ТЕКСТОВИЙ ПРОСТОР ] [ КЛЮЧ ІНДЕКСА ] [ ім’я_індексу ] ( ім’я_стовпця індексу. ) [ тип_індексу ] ADD [ CONSTRAINT [ symbol ] ] FOREIGN KEY [ index_name ] ( index_col_name. ) reference_definition ALTER [ COLUMN ] col_name < SET DEFAULT літерал DROP DEFAULT > CHANGE [ COLUMN ] old_col_name new_col_name column_definition [ FIRSTAFTER col_name ] MODIFY [ COLUMN ] col_name column_definition [ FIRST AFTER col_name ] DROP [ COLUMN ] col_name DROP PRIMARY KEY DROP < INDEXKEY >index_name DROP FOREIGN KEY fk_symbol DISABLE KEYS ENABLE KEYS RENAME [ TO ] new_tbl_name ORDER BY col_name [ , col_name ] . ПЕРЕТВОРЮВАТИ НА НАБІР СИМВОЛІВ набір_назва [ COLLATE collation_name ] [ DEFAULT ] CHARACTER SET [ = ] charset_name [ COLLATE [ = ] collation_name ] ВИДАЛИТИ ТАБЛИЧНИЙ ПРОСТОР ІМПОРТОВАТИ ТАБЛИЧНИЙ ПРОСТОР

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

Синтаксис оператора ALTER TABLE у багатьох подібних випадках синтаксису CREATE TABLE. Для отримання детальної інформації див. раздел 11.1.5, «СИНТАКСИС СТВОРЕННЯ ТАБЛИЦІ».

Якщо ви використовуєте оператор ALTERTABLE для зміни колонки, але оператор 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 як показано нижче:

Для перейменування таблиці з t1 в t2:

Для зміни колонки a з INTEGER на TINYINT NOT NULL (без перейменування) і зміни колонки b з CHAR (10) на CHAR (20) одночасно перейменуючи її з b в c:

Для додавання нової колонки d типу TIMESTAMP:

Для додавання індексу на колонку d та унікального індексу на колонку a :

Для видалення колонки c:

Для додавання нової цілісної AUTO_INCREMENT колонки 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 колонку:

Тут передбачається, що таблиця t1 має колонки col1 і col2.

Наступні оператори також створюють нову таблицю t2 ідентичну t1 , але колонку, що має AUTO_INCREMENT:

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