Синтаксис на оператора ALTER TABLE - статия за
Синтаксис на оператора ALTER TABLE
ALTER [ IGNORE ] TABLE tbl_name промяна_спецификация [, промяна_спецификация] .
alter_specification: table_option. ДОБАВЯНЕ [ КОЛОНА ] име_на_колона дефиниция_на_колона [ ПЪРВО СЛЕД име_на_колона] ДОБАВЯНЕ [ КОЛОНА ] ( име на колона дефиниция_на_колона. ) ДОБАВЯНЕ < INDEXKEY >[ име_на_индекс ] [ тип_индекс ] ( име_на_кола на индекс. ) [ тип_индекс ] ДОБАВЯНЕ [ ОГРАНИЧЕНИЕ [ символ ] ] ОСНОВЕН КЛЮЧ [ тип_индекс ] ( име_на_кола на индекс. ) [ тип_индекс ] ДОБАВЯНЕ [ ОГРАНИЧЕНИЕ [ символ ] ] УНИКАЛ [ ИНДЕКС КЛЮЧ ] [ име_на_индекс ] [ тип_индекс ] ( име_на_кола_индекс. ) [ тип_индекс ] ДОБАВЯНЕ [ FULLTEXTSPATIAL ] [ INDEXKEY ] [ име_на_индекс ] ( име_на_кола. ) [ тип_индекс ] ДОБАВЯНЕ [ ОГРАНИЧЕНИЕ [ символ ] ] ВЪНШЕН КЛЮЧ [ име_на_индекс ] ( име_на_кола . ) референтна_дефиниция ALTER [ КОЛОНА ] име_на_колона < 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 >име_на_индекс ПУСКАНЕ НА ВЪНШЕН КЛЮЧ fk_symbol ИЗКЛЮЧВАНЕ НА КЛЮЧОВЕ РАЗРЕШАВАНЕ НА КЛЮЧОВЕ ПРЕИМЕНУВАНЕ [ КЪМ ] ново_име_на_табл. КОНВЕРТИРАНЕ КЪМ НАБОР ЗНАКОВ набор_набор [ COLLATE collation_name ] [ ПО ПОДРАЗБИРАНЕ ] CHARACTER SET [ = ] име_на_набор [ COLLATE [ = ] име_на_съпоставяне ] ИЗХВЪРЛЕТЕ ТАБЛИЧНОТО ПРОСТРАНСТВО ИМПОРТИРАНЕ НА ТАБЛИЧНОТО ПРОСТРАНСТВО
index_col_name: col_name [ ( дължина ) ] [ ASC DESC ]
Синтаксисът на оператора ALTER TABLE в много случаи на подобен синтаксис CREATE TABLE. За получаване на подробна информация см. раздел 11.1.5, "СЪЗДАВАНЕ НА ТАБЛИЦА Синтаксис".
Ако използвате оператор ALTERTABLE за промяна на колона, но операторът DESCRIBE tbl_name показва, че вашата колона е останала непроменена, възможно е MySQL сървърът да е игнорирал промените ви поради една от причините, описани в Раздел 11.1.5.1, „Тихи промени в спецификацията на колона“
В повечето случаи операторът 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“.) Потребителските разрешения, специфични за преименуваната таблица, няма да бъдат прехвърлени към новото име. Те трябва да бъдат променени ръчно с помощта на операторите GRANT и REVOKE.
Ако използвате оператора ALTER TABLE с опции, различни от RENAME, MySQL винаги създава временна таблица, дори ако не е известно, че данните трябва да бъдат копирани (например, когато името на колона се промени). За таблици тип MyISAM можете да ускорите повторното изграждане на индекса (това е най-бавната част в процеса на промяна)задаване на системната променлива myisam_sort_buffer_size на по-голяма стойност.
За информация относно възможни проблеми при използване на оператора ALTER TABLE вижте раздел B.1.7.1. „Проблеми с 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, ние дефинирахме колоната c като NOT NULL.
Когато добавите колона AUTO_INCREMENT, тя автоматично се попълва с последователни цели числа. За MyISAM таблици можете да укажете стойността на първата стойност, като издадете командата SET INSERT_ID=value преди оператора ALTER TABLE или като използвате опцията AUTO_INCREMENT =value table. Вижте раздел 5.1.4, „Системни променливи на сесията“.
В случай на MyISAM таблици, ако колоната AUTO_INCREMENT не се променя, номерирането на числата не се променя. Ако първоизтрийте колоната AUTO_INCREMENT и след това създайте нова колона AUTO_INCREMENT, след което тя ще започне да се попълва от една.
Когато използвате репликация, добавянето на колона AUTO_INCREMENT не гарантира еднакъв ред на главния и подчинения ред. Това е така, защото редът, в който се номерират редовете, зависи от конкретния механизъм за съхранение, използван за таблицата, и реда, в който редовете са добавени към таблицата. Ако е важно да има един и същ ред на редовете на главния и подчинения, редовете трябва да бъдат подредени преди да се присвои номерът AUTO_INCREMENT. Да предположим, че искате да добавите колона AUTO_INCREMENT към таблица t1, следният израз е нова таблица t2, идентична на t1, но имаща колона AUTO_INCREMENT:
Това предполага, че таблица t1 има колони col1 и col2.
Следните изрази също създават нова таблица t2, идентична на t1, но с колона AUTO_INCREMENT:
Независимо от метода, използван за създаване и попълване на копие, което има колона AUTO_INCREMENT, последната стъпка е същата: премахване на оригиналната таблица и преименуване на копието: