Синтаксис ALTER TABLE - HTML, CSS, JavaScript, Perl, PHP, MySQL

Синтаксис ALTER TABLE

Пам'ятайте, що якщо ви використовуєте будь-які опції ALTER TABLE за винятком RENAME, MySQL завжди створює тимчасову таблицю, навіть якщо немає суворої необхідності копіювати дані (наприклад, коли ви всього лише перейменовуєте стовпець). Ми плануємо виправити це у майбутньому, але оскільки ALTER TABLE – оператор, який використовується нечасто, це завдання не має високого пріоритету у наших планах. Для таблиць MyISAM можна прискорити процедуру перестворення індексів (що є найповільнішою частиною в процесі виконання цього оператора), надавши системній змінній myisam_sort_buf fer_size більше значення.

  1. CHANGE ім'я_стовпця, DROP ім'я_стовпця та DROP INDEX - це MySQL-розширення стандарту SQL.
  2. MODIFY – це розширення ALTER TABLE від Oracle.

  • Слово COLUMN - абсолютно необов'язкове та може бути опущене.

  1. Якщо ви використовуєте ALTER TABLE ім'я_таблиці RENAME TO нове_ім'я_таблиці без будь-яких опцій, MySQL просто перейменовує всі файли, що стосуються таблиці ім'я_таблиці. Немає необхідності створювати тимчасову таблицю. (Ви також можете використовувати оператор RENAME TABLE для перейменування таблиць. Див. розділ Синтаксис RENAME TABLE)
  2. Конструкції определение_столбца використовують той самий синтаксис для ADD і CHANGE, як і CREATE TABLE. Слід зазначити, що синтаксис включає ім'я стовпця, а не лише його тип. розділ Синтаксис CREATE TABLE
  3. Ви можете перейменовувати стовпці, використовуючи конструкцію CHANGE старе_ім'я_стовпця визначення_стовпця. Щоб це зробити, вкажіть старі та нові імена, а також типи стовпців. Наприклад, щоб перейменувати стовпець INTEGER з а в b, можна зробити так:

mysql> ALTER TABLE tl CHANGE ab INTEGER; Якщо ви хочете змінити тільки тип стовпця, не змінюючи імені, синтаксис CHANGE все одно вимагає вказівки старого та нового імені стовпця, навіть якщо ці імена однакові. Наприклад: mysql> ALTER TABLE tl CHANGE b b BIGINT NOT NULL; Проте, починаючи з версії MySQL 3.22.16а, ви також можете використовувати MODIFY для зміни типу стовпця без його перейменування: mysql> ALTER TABLE tl MODIFY b BIGINT NOT NULL;

Увага! Попередня операція перетворює значення стовпців між старим та новим набором символів. Це не те, що потрібно, якщо у вас є стовпець в одному наборі символів (на зразок latin i), але містить значення, що насправді використовують якийсь інший, несумісний набір символів (на зразок utf8). У цьому випадку для кожної такої стовпці потрібно виконати такі оператори: ALTER TABLE tl CHANGE cl cl BLOB; ALTER TABLE tl CHANGE cl cl TEXT CHARACTER SET utf8; Це працює, оскільки не відбувається перетворення стовпців типу BLOB. Для зміни набору символів за замовчуванням для таблиці скористайтеся наступним оператором: ALTER TABLE имя_таблицыDEFAULT CHARACTER SET имя_набора_символов; Слово DEFAULT є необов'язковим. Набір символів за замовчуванням - це той набір, який застосовується для нових стовпців, що додаються до таблиці, якщо не вказується явно (наприклад, ALTER TABLE. ADD column).Увага! Починаючи з MySQL 4.1.2 і вище, ALTER TABLE .. .DEFAULT CHARACTER SET та ALTER TABLE . CHARACTER SET еквівалентні та змінюють лише набір символів за замовчуванням. У випусках MySQL 4.1, що передують 4.1.2, ALTER TABLE. DEFAULT CHARACTER SET змінює стандартний набір символів, a ALTER TABLE. .. CHARACTER SET змінює набір символів за промовчанням і перетворює всі стовпці.

  • Для таблиці innoDB, яка була створена у своєму власному табличному просторі у файлі . ibd, цей файл може бути відкинуто та імпортовано. Щоб відкинути файл (discard) .ibd, скористайтеся наступним оператором: ALTER TABLE имя_таблицы DISCARD TABLESPACE; Наведений вище оператор видаляє поточний файл . ibd, тому спочатку переконайтеся, що ви маєте резервну копію. Спроби звернутися до таблиці, коли відкинуто файл табличного простору, призводять до помилки. Щоб імпортувати назад резервну копію файлу . ibd, скопіюйте його в каталог даних та виконайте наступний оператор: ALTER TABLE имя__таблицы IMPORT TABLESPACE;
  • За допомогою функції CAPI mysql_info() можна визначити, скільки записів було скопійовано і (коли застосовується IGNORE) скільки записів було видалено через дублювання значень унікальних ключів. Нижче наведено деякі приклади, що демонструють застосування оператора ALTER TABLE. Почнемо з таблиці tl, створеної так: mysql>CREATE TABLE tl (a INTEGER,b CHAR(IO)); Щоб перейменувати таблицю з tl в t2, скористайтеся таким оператором: mysql>ALTER TABLE tl RENAME tl; Щоб змінити тип стовпця з INTEGER на Tinyint NOT NULL (залишивши його ім'я колишнім), і щоб змінити тип стовпця b з CHAR (10) на CHAR (20) і перейменувати його на с, скористайтеся таким оператором: mysql> : raysql> ALTER TABLE t2 ADD d TIMESTAMP; Щоб додати індекси по стовпцю d та стовпцю а, скористайтесь таким оператором: mysql>ALTER TABLE t2 ADD INDEX(d), ADD INDEX(a) ; Щоб видалити стовпець, виконайте такий оператор:mysql>ALTER TABLE t2 DROP COLUMN c; Щоб додати новий стовпець з іменем з цілого типу, що має властивість AUTO_ INCREMENT, скористайтеся наступним оператором: mysql>ALTER TABLE t2 ADD INT UNSIGNED NOT NULL AUTO_INCREMENT, -> ADD PRIMARY KEY (c); Слід зазначити, що ми проіндексували стовпець з (як первинний ключ), оскільки стовпці AUTO_INCREMENT повинні бути проіндексовані. Крім того, стовпець з оголошений як NOT NULL, так як стовпці первинного ключа не можуть бути NULL. Коли додається стовпець з атрибутом AUTO_INCREMENT, він автоматично заповнюється значеннями послідовності цілих чисел. Для таблиць MyISAM можна вказати перше число послідовності, виконавши SET INSERT_ID=значення перед запуском ALTER TABLE, або скориставшись опцією таблиці AUTO_INCREMENT=3Ha4eH#e. Див. Синтаксис SET

Для таблиць MylSAM, якщо ви не змінюєте стовпець AUTO_INCREMENT, числову послідовність не буде порушено. Якщо ви видаляєте стовпець autO_inCREMENT, а потім додаєте інший стовпець AUTO_INCREMENT, числа будуть перенумеровані, починаючи з 1. У MySQL 3.23.50 і пізніших версіях InnoDB дозволяє додавати нові обмеження зовнішніх ключів до таблиці за допомогою оператора ALTER TABLE: ALTER TABLE ім'я_таблиці ADD [CONSTRAINT символ] FOREIGN KEY [ідентифікатор] [ім'я_стовпця_індексу, .. .) REFERENCES ім'я_таблиці [ON DELETE ] [ON UPDATE ] <1 створити всі необхідні індекси. Використовуючи ALTER TABLE, в таблицю можна також додавати зовнішні ключі, що посилаються на цю ж таблицю. Починаючи з MySQL 4.0.13, InnoDB підтримує застосування ALTER TABLE для видалення зовнішніх ключів:<12 10>ALTER TABLE имя_таблицыDROP FOREIGN KEY символ_Ы; Якщо конструкція FOREIGN KEYвключає ім'я CONSTRAINT, коли створюється зовнішній ключ, ви можете посилатися на нього, щоб видалити цей зовнішній ключ. (Ім'я обмеження зовнішнього ключа може присвоюватися, починаючи з MySQL 4.0.18.) Інакше InnoDB генерує внутрішнє значення символ_£до створення зовнішнього ключа. Щоб дізнатися це значення, коли потрібно видалити зовнішній ключ, скористайтеся оператором SHOW CREATE table, наприклад: mysql>SHOW CREATE TABLE ibtestllc\G Table: ibtestllc Create Table: CREATE TABLE чибtestllc4 ( 'A1 int(ll) NOT NULL auto_increment, 'D' int(ll) NOT NULL default ', "B' varchar(200) NOT NULL default ", СЧ varchar(175) default NULL, PRIMARY KEY ('AV D4, 'B'), KEY VB* (4B\X") , KEY NC4 TCN), CONSTRAINT ч0_38775ч FOREIGN KEY fA\ 'D') REFERENCES 4ibtestlla4 ГА4, *DV) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT ч0_38776ч FOREIGN KEYCB ON DELETE CASCADE ON UPDATE CASCADE ) TYPE = InnoDB CHARSET = latinl 1 row in set (0.01 sec) mysql>ALTER TABLE ibtestllc DROP FOREIGN KEY 0_38775; CREATE INDEX не повинні застосовуватися для таблиць, які мають обмеження зовнішніх ключів, або на які посилаються зовнішні ключі інших таблиць Будь-який оператор ALTER TABLE видаляє всі обмеження зовнішніх ключів, визначені в таблиці Не можна також застосовувати alter TABLE до таблиць, на які є посилання. Натомість потрібно користуватися DROP

TABLE та CREATE TABLE для модифікації схеми. Коли сервер MySQL виконує ALTER TABLE, він може приховано виконувати RENAME TABLE, і це збиває з пантелику обмеження зовнішніх ключів, які посилаються на таблицю. У MySQL оператор CREATE INDEX обробляється як ALTER TABLE, тому вищесказане стосуєтьсята цього оператора. розділ Проблеми з ALTER TABLE