Spec-Zone .ru
спецификации, руководства, описания, API
|
ALTER [IGNORE] TABLEtbl_name
[alter_specification
[,alter_specification
] ...] [partition_options
]alter_specification
:table_options
| ADD [COLUMN]col_name
column_definition
[FIRST | AFTERcol_name
] | ADD [COLUMN] (col_name
column_definition
,...) | ADD {INDEX|KEY} [index_name
] [index_type
] (index_col_name
,...) [index_option
] ... | ADD [CONSTRAINT [symbol
]] PRIMARY KEY [index_type
] (index_col_name
,...) [index_option
] ... | ADD [CONSTRAINT [symbol
]] UNIQUE [INDEX|KEY] [index_name
] [index_type
] (index_col_name
,...) [index_option
] ... | ADD FULLTEXT [INDEX|KEY] [index_name
] (index_col_name
,...) [index_option
] ... | ADD SPATIAL [INDEX|KEY] [index_name
] (index_col_name
,...) [index_option
] ... | ADD [CONSTRAINT [symbol
]] FOREIGN KEY [index_name
] (index_col_name
,...)reference_definition
| ALGORITHM [=] {DEFAULT|INPLACE|COPY} | ALTER [COLUMN]col_name
{SET DEFAULTliteral
| DROP DEFAULT} | CHANGE [COLUMN]old_col_name
new_col_name
column_definition
[FIRST|AFTERcol_name
] | LOCK [=] {DEFAULT|NONE|SHARED|EXCLUSIVE} | MODIFY [COLUMN]col_name
column_definition
[FIRST | AFTERcol_name
] | DROP [COLUMN]col_name
| DROP PRIMARY KEY | DROP {INDEX|KEY}index_name
| DROP FOREIGN KEYfk_symbol
| DISABLE KEYS | ENABLE KEYS | RENAME [TO|AS]new_tbl_name
| ORDER BYcol_name
[,col_name
] ... | CONVERT TO CHARACTER SETcharset_name
[COLLATEcollation_name
] | [DEFAULT] CHARACTER SET [=]charset_name
[COLLATE [=]collation_name
] | DISCARD TABLESPACE | IMPORT TABLESPACE | FORCE | ADD PARTITION (partition_definition
) | DROP PARTITIONpartition_names
| TRUNCATE PARTITION {partition_names
| ALL} | COALESCE PARTITIONnumber
| REORGANIZE PARTITIONpartition_names
INTO (partition_definitions
) | EXCHANGE PARTITIONpartition_name
WITH TABLEtbl_name
| ANALYZE PARTITION {partition_names
| ALL} | CHECK PARTITION {partition_names
| ALL} | OPTIMIZE PARTITION {partition_names
| ALL} | REBUILD PARTITION {partition_names
| ALL} | REPAIR PARTITION {partition_names
| ALL} | REMOVE PARTITIONINGindex_col_name
:col_name
[(length
)] [ASC | DESC]index_type
: USING {BTREE | HASH}index_option
: KEY_BLOCK_SIZE [=]value
|index_type
| WITH PARSERparser_name
| COMMENT 'string
'table_options
:table_option
[[,]table_option
] ... (seeCREATE TABLE
options)partition_options
: (seeCREATE TABLE
options)
ALTER
TABLE
изменяет структуру таблицы. Например, можно добавить или удалить столбцы, создать или
уничтожить, индексирует, измените тип существующих столбцов, или переименуйте столбцы или таблицу
непосредственно. Можно также изменить характеристики, такие как механизм хранения, используемый для таблицы или
табличного комментария.
Связанные с разделением пункты для ALTER
TABLE
может использоваться с разделенными таблицами для того, чтобы повторно разделить, для того,
чтобы добавить, отбросить, объединить, и разделить разделы, и для того, чтобы выполнить обслуживание разделения.
Это возможно для ALTER TABLE
оператор, чтобы содержать a PARTITION
BY
или REMOVE PARTITIONING
пункт в дополнении к другому изменять
спецификации, но PARTITION BY
или REMOVE PARTITIONING
пункт должен быть определен последний после любых других спецификаций. ADD
PARTITION
, DROP PARTITION
, COALESCE
PARTITION
, REORGANIZE PARTITION
, ANALYZE
PARTITION
, CHECK PARTITION
, и REPAIR
PARTITION
опции не могут быть объединены с другим изменять спецификации в сингле ALTER TABLE
, начиная с опций только перечисленное действие на отдельных разделах.
Для получения дополнительной информации см. Раздел
13.1.7.1,"ALTER TABLE
Операции раздела".
После имени таблицы определите изменения, которые будут сделаны. Если ни один не дается, ALTER TABLE
ничего не делает.
Синтаксис для многих из допустимых изменений подобен пунктам CREATE TABLE
оператор. См. Раздел
13.1.17,"CREATE TABLE
Синтаксис", для получения дополнительной
информации.
Некоторые операции могут привести к предупреждениям если предпринято на таблице, для которой механизм хранения
не поддерживает работу. Эти предупреждения могут быть выведены на экран с SHOW WARNINGS
. См. Раздел
13.7.5.41,"SHOW WARNINGS
Синтаксис".
Для получения информации о поиске и устранении неисправностей ALTER TABLE
, см. Раздел C.5.7.1,
"Проблемы с ALTER TABLE
".
В большинстве случаев, ALTER TABLE
делает
временную копию исходной таблицы. MySQL ожидает других операций, которые изменяют таблицу, затем продолжается.
Это включает изменение в копию, удаляет исходную таблицу, и переименовывает новый. В то время как ALTER TABLE
выполняется, исходная таблица читаема другими сеансами (с
исключением, отмеченным коротко). Обновления и записи к таблице, которые начинаются после ALTER TABLE
работа начинается, останавливаются, пока новая таблица не готова,
затем автоматически перенаправляется к новой таблице без любых отказавших обновлений. Временная таблица
создается в каталоге базы данных новой таблицы. Это может отличаться от каталога базы данных исходной таблицы
для ALTER
TABLE
операции, которые переименовывают таблицу к различной базе данных.
Исключение, упомянутое ранее, является этим ALTER
TABLE
блочные чтения (не только пишет) в точке, где это готово установить новую версию таблицы .frm
файл, отбросьте старый файл, и очистите устаревшие структуры таблиц от таблицы
и табличных кэшей определения. В этой точке это должно получить монопольную блокировку. Чтобы сделать так, это
ожидает текущих читателей, чтобы закончиться, и блокирует новые чтения (и записи).
Для MyISAM
таблицы, можно убыстриться, индексируют воссоздание (самая медленная
часть процесса изменения), устанавливая myisam_sort_buffer_size
системная переменная к высокому значению.
Для некоторых операций, оперативного ALTER
TABLE
возможно, который не требует временной таблицы:
Для ALTER TABLE
без любых других опций MySQL
просто переименовывает любые файлы, которые соответствуют таблице tbl_name
RENAME TO new_tbl_name
tbl_name
не делая копию. (Можно также использовать RENAME TABLE
оператор, чтобы переименовать таблицы. См. Раздел
13.1.32,"RENAME TABLE
Синтаксис".) Любые полномочия,
предоставленные определенно для переименованной таблицы, не перемещаются на новое имя. Они должны быть
изменены вручную.
Изменения, которые изменяют только табличные метаданные и не табличные данные,
могут быть сразу сделаны, изменяя таблицу .frm
файл и не затрагивающее
табличное содержание. Следующие изменения являются быстрыми изменениями, которые могут быть пробиты:
Переименование столбца, за исключением InnoDB
механизм хранения перед MySQL 5.6.6.
Изменение значения по умолчанию столбца (за исключением NDB
таблицы; см. Ограничения
MySQL Cluster онлайновые операции).
Изменение определения ENUM
или SET
столбец, добавляя новое перечисление или элементы
множества до конца списка допустимых задействованных
значений, пока размер хранения типа данных не изменяется. Например, добавляя элемент к a SET
столбец, у которого есть 8 элементов, изменяет
необходимое хранение на значение от 1 байта до 2 байтов; это потребует табличной копии.
Добавление элементов в середине изменения нумерации причин списка существующих элементов,
которое требует табличной копии.
ALTER TABLE
с ADD
PARTITION
, DROP PARTITION
, COALESCE
PARTITION
, REBUILD PARTITION
, или REORGANIZE
PARTITION
не создает временных таблиц (кроме тех случаев, когда используемый с NDB
таблицы); однако, эти операции могут и действительно создавать
временные файлы раздела.
ADD
или DROP
операции для RANGE
или LIST
разделы являются
непосредственными операциями или почти так. ADD
или COALESCE
операции для HASH
или KEY
разделы не копируют данные между всеми разделами, если LINEAR HASH
или LINEAR KEY
использовался; это - эффективно то же самое как составление новой таблицы, хотя ADD
или COALESCE
работа является
выполняемым разделом разделом. REORGANIZE
операции копируют только
измененные разделы и не касаются неизменных.
Переименование индексирования, за исключением InnoDB
.
Добавление или отбрасывание индексирования, для InnoDB
и NDB
.
Можно вызвать ALTER TABLE
работа, которая иначе не потребовала бы, чтобы табличная
копия использовала метод временной таблицы (как поддерживающийся в MySQL 5.0), устанавливая old_alter_table
системная переменная к ON
, или
определение ALGORITHM=COPY
как один из alter_specification
пункты. Если есть конфликт между old_alter_table
установка и ALGORITHM
пункт со значением кроме DEFAULT
, ALGORITHM
пункт
имеет приоритет. (ALGORITHM = DEFAULT
то же самое определение нет ALGORITHM
пункт вообще.)
Определение ALGORITHM=INPLACE
заставляет работу использовать оперативный метод для
пунктов и механизмов хранения, которые поддерживают это, и сбой с ошибкой иначе, таким образом избегая длинной
табличной копии, если Вы пытаетесь изменить таблицу, которая использует различный механизм хранения, чем Вы
ожидаете. См. Раздел 5.5, "Онлайновый DDL для InnoDB
Таблицы" для информации об онлайновом DDL для InnoDB
таблицы.
MySQL Cluster также поддерживает онлайн ALTER TABLE
операции используя ONLINE
ключевое слово, поддерживаемое только MySQL Cluster; см. Раздел
13.1.7.2,"ALTER TABLE
Онлайновые Операции в MySQL Cluster", для
точного синтаксиса и других подробных сведений.
Можно управлять уровнем параллельного чтения и записи таблицы, в то время как это изменяется, используя LOCK
пункт. Определение значения не по умолчанию для этого пункта позволяет Вам
требовать определенного количества параллельного доступа или исключительности во время изменить работы, и
останавливает работу, если требуемая степень блокировки не доступна. Параметры для LOCK
пункт:
LOCK = DEFAULT
LOCK = NONE
LOCK = SHARED
LOCK = EXCLUSIVE
С MySQL 5.6.3 можно также использовать ALTER TABLE
чтобы выполнить "нуль" изменяют работу, которая восстанавливает таблицу. Ранее tbl_name
FORCEFORCE
опция была распознана, но проигнорирована.
Для NDB
таблицы, операции, которые добавляют и отбрасывание, индексируют на переменных-width столбцах, происходят
онлайн, без любого табличного копирования и не блокируя параллельные действия DML для большей части их
продолжительности. См. Раздел 13.1.7.2,"ALTER TABLE
Онлайновые Операции в MySQL Cluster".
Использовать ALTER
TABLE
, Вы нуждаетесь ALTER
,
CREATE
, и INSERT
полномочия
для таблицы. Переименование таблицы требует ALTER
и DROP
на старой таблице, ALTER
, CREATE
, и INSERT
на новой таблице.
IGNORE
расширение MySQL стандартного SQL. Это управляет
как ALTER TABLE
работы, если есть копии на уникальных ключах в новой
таблице или если предупреждения происходят, когда строгий режим включается. Если IGNORE
не определяется, копия прерывается и откатывается, если двойные ключевые ошибки происходят. Если IGNORE
определяется, только первая строка используется строк с копиями на
уникальном ключе. Другие конфликтные строки удаляются. Неправильные значения являются усеченными к
самому близкому соответствующему приемлемому значению.
Ожидание INSERT
DELAYED
операторы теряются, если таблица является заблокированной записью и ALTER TABLE
используется, чтобы изменить структуру таблицы.
table_option
показывает табличную опцию
вида, который может использоваться в CREATE
TABLE
оператор, такой как ENGINE
, AUTO_INCREMENT
,
AVG_ROW_LENGTH
, или MAX_ROWS
. Для списка всех
табличных опций и описаний каждого, см. Раздел
13.1.17,"CREATE TABLE
Синтаксис". Однако, ALTER TABLE
игнорирует DATA DIRECTORY
и
INDEX DIRECTORY
табличные опции.
Например, чтобы преобразовать таблицу, чтобы быть InnoDB
таблица,
используйте этот оператор:
ALTER TABLE t1 ENGINE = InnoDB;
См. Раздел 5.4.3, "Преобразовывая
Таблицы из MyISAM
к InnoDB
"для
соображений, переключая таблицы на InnoDB
механизм хранения.
Когда Вы определяете ENGINE
пункт, ALTER TABLE
восстанавливает таблицу. Это - истина, даже если у
таблицы уже есть указанный механизм хранения.
На результат попытки изменить механизм хранения таблицы влияют тем, доступен ли требуемый механизм
хранения и установка NO_ENGINE_SUBSTITUTION
Режим SQL, как описано в Разделе
5.1.7, "Режимы SQL Сервера".
Предотвратить непреднамеренную потерю данных, ALTER TABLE
не может использоваться, чтобы изменить механизм хранения
таблицы к MERGE
или BLACKHOLE
.
Изменить значение AUTO_INCREMENT
в противоречии с использоваться для
новых строк, сделайте это:
ALTER TABLE t2 AUTO_INCREMENT = value
;
Невозможно сбросить в противоречии со значением, меньше чем или равным никому, которые уже
использовались. Для MyISAM
, если значение меньше чем или равно
максимальному значению в настоящий момент в AUTO_INCREMENT
столбец,
значение сбрасывается к текущему максимуму плюс один. Для InnoDB
, если значение является меньше чем текущее максимальное значение в
столбце, никакая ошибка не происходит, и текущее значение последовательности не изменяется.
Можно выйти многократный ADD
, ALTER
,
DROP
, и CHANGE
пункты в сингле ALTER TABLE
оператор, разделенный запятыми. Это - расширение MySQL
стандартного SQL, который разрешает только один из каждого пункта на ALTER TABLE
оператор. Например, чтобы отбросить многократные столбцы
в единственном операторе, сделайте это:
ALTER TABLE t2 DROP COLUMN c, DROP COLUMN d;
CHANGE
, col_name
DROP
, и col_name
DROP INDEX
расширения MySQL стандартного SQL.
Слово COLUMN
является дополнительным и может быть
опущен.
column_definition
пункты используют тот же
самый синтаксис для ADD
и CHANGE
что касается
CREATE TABLE
. См. Раздел
13.1.17,"CREATE TABLE
Синтаксис".
Можно переименовать столбец, используя a CHANGE
пункт. Чтобы сделать так, определите
старые и новые имена столбцов и определение, которое в настоящий момент имеет столбец. Например, чтобы
переименовать old_col_name
new_col_name
column_definition
INTEGER
столбец от a
к b
, можно сделать это:
ALTER TABLE t1 CHANGE a b INTEGER;
Изменить тип столбца, но не имя, CHANGE
синтаксис все еще требует
старого и нового имени столбца, даже если они - то же самое. Например:
ALTER TABLE t1 CHANGE b b BIGINT NOT NULL;
Можно также использовать MODIFY
изменить тип столбца, не переименовывая
это:
ALTER TABLE t1 MODIFY b BIGINT NOT NULL;
MODIFY
расширение ALTER TABLE
для совместимости Oracle.
Когда Вы используете CHANGE
или MODIFY
,
column_definition
должен включать тип данных и все
атрибуты, которые должны примениться к новому столбцу, кроме индексируют атрибуты такой как PRIMARY KEY
или UNIQUE
. Атрибуты,
существующие в исходном определении, но не определенный для нового определения, не продвигаются.
Предположите что столбец col1
определяется как INT
UNSIGNED DEFAULT 1 COMMENT 'my column'
и Вы изменяете столбец следующим образом:
ALTER TABLE t1 MODIFY col1 BIGINT;
Получающийся столбец будет определен как BIGINT
, но не будет включать
атрибуты UNSIGNED DEFAULT 1 COMMENT 'my column'
. Чтобы сохранить их,
оператор должен быть:
ALTER TABLE t1 MODIFY col1 BIGINT UNSIGNED DEFAULT 1 COMMENT 'my column';
Когда Вы изменяете использование типа данных CHANGE
или MODIFY
, MySQL пытается преобразовать существующие значения столбцов в
новый тип так же как возможный.
Это преобразование может привести к изменению данных. Например, если Вы сокращаете
строковый столбец, значения могут быть усеченными. Чтобы препятствовать тому, чтобы работа
успешно выполнилась, если бы преобразования в новый тип данных привели бы к потере данных,
включите строгому режиму SQL перед использованием ALTER TABLE
(см. Раздел
5.1.7, "Режимы SQL Сервера").
Чтобы добавить столбец в определенной позиции в пределах строки таблицы,
использовать FIRST
или AFTER
.
Значение по умолчанию должно добавить последний столбец. Можно также использовать col_name
FIRST
и AFTER
в CHANGE
или MODIFY
операции, чтобы переупорядочить столбцы в пределах таблицы.
ALTER ... SET DEFAULT
или
ALTER ... DROP DEFAULT
определите новое значение по умолчанию для столбца
или удалите старое значение по умолчанию, соответственно. Если старое значение по умолчанию удаляется, и
столбец может быть NULL
, новое значение по умолчанию NULL
.
Если столбец не может быть NULL
, MySQL присваивает значение по умолчанию
как описано в Разделе 11.5, "Значения по умолчанию Типа
данных".
DROP INDEX
удаляет индексирование. Это - расширение MySQL стандартного
SQL. См. Раздел
13.1.24,"DROP INDEX
Синтаксис". Если Вы неуверены в имени
индекса, использовать SHOW INDEX FROM
. tbl_name
Если столбцы отбрасываются от таблицы, столбцы также удаляются от любого,
индексируют, из которых они - часть. Если все столбцы, которые составляют индексирование, отбрасываются,
индексирование отбрасывается также. Если Вы используете CHANGE
или MODIFY
чтобы сократить столбец, для которого индексирование существует на
столбце, и получающаяся длина столбца является меньше чем индексировать длина, MySQL сокращает
индексирование автоматически.
Если таблица содержит только один столбец, столбец не может быть отброшен. Если то,
что Вы предназначаете, должно удалить таблицу, использовать DROP TABLE
вместо этого.
DROP PRIMARY KEY
отбрасывает
первичный ключ. Если нет
никакого первичного ключа, ошибка происходит. Для получения информации о показателях производительности
первичных ключей, специально для InnoDB
таблицы, см. Раздел
8.3.2, "Используя Первичные ключи".
Если Вы добавляете a UNIQUE INDEX
или PRIMARY
KEY
к таблице MySQL хранит это прежде, чем любой групповой индексирует, чтобы разрешить,
чтобы обнаружение сделало дубликаты ключа как можно раньше.
Некоторые механизмы хранения разрешают Вам определять индексировать тип, создавая
индексирование. Синтаксис для index_type
спецификатор USING
. Для получения
дополнительной информации о type_name
USING
, см. Раздел
13.1.13,"CREATE INDEX
Синтаксис". Привилегированная
позиция после списка столбцов. Поддержка использования опции перед списком столбцов будет удалена в
будущем выпуске MySQL.
index_option
значения определяют дополнительные опции для
индексирования. USING
одна такая опция. Для получения дополнительной
информации о допустимом index_option
значения, см. Раздел
13.1.13,"CREATE INDEX
Синтаксис".
После ALTER
TABLE
оператор, может быть необходимо работать ANALYZE TABLE
чтобы обновить индексируют информацию о количестве
элементов. См. Раздел
13.7.5.23,"SHOW INDEX
Синтаксис".
ORDER BY
позволяет Вам составить новую таблицу со строками в определенном порядке. Отметьте, что таблица не
остается в этом порядке после того, как вставляет и удаляет. Эта опция полезна прежде всего, когда Вы
знаете, что должны главным образом запросить строки в определенном порядке большую часть времени. При
использовании этой опции после существенных изменений к таблице Вы могли бы быть в состоянии получить
более высокую производительность. В некоторых случаях это могло бы сделать сортировку легче для MySQL,
если таблица в порядке столбцом, которым Вы хотите упорядочить это позже.
ORDER BY
синтаксис разрешает одному или более именам столбцов быть
определенными для того, чтобы сортировать, каждый из которых дополнительно может сопровождаться
ASC
или DESC
указать на сортировку по
возрастанию или сортировку по убыванию, соответственно. Значение по умолчанию является порядком по
возрастанию. Только имена столбцов разрешаются как критерии сортировки; произвольные выражения не
разрешаются. Этот пункт должен быть дан последний после любых других пунктов.
ORDER BY
не имеет смысла для InnoDB
таблицы, которые содержат определяемый пользователем кластерный индекс (PRIMARY
KEY
или NOT NULL UNIQUE
индексируйте). InnoDB
всегда строки таблицы "Заказы" согласно такому
индексировать, если Вы присутствуете.
Когда использующийся на разделенной таблице, ALTER TABLE ...
ORDER BY
строки заказов в пределах каждого раздела только.
Если Вы используете ALTER TABLE
на a MyISAM
таблица, все
групповые индексируют, создаются в отдельном пакете (что касается REPAIR TABLE
). Это должно сделать ALTER TABLE
намного быстрее, когда Вы имеете, многие индексируют.
Эта опция может быть активирована явно для a MyISAM
таблица. ALTER TABLE ... DISABLE KEYS
говорит, что MySQL, чтобы прекратить
обновлять групповой индексирует. ALTER TABLE ... ENABLE KEYS
тогда
должен использоваться, чтобы воссоздать без вести пропавших, индексирует. MySQL делает это со
специальным алгоритмом, который намного быстрее чем вставка ключей один за другим, таким образом,
отключение ключей прежде, чем выполнить объемные операции вставки должно дать значительное
ускорение. Используя ALTER TABLE ... DISABLE KEYS
требует INDEX
полномочие в дополнение к полномочиям, упомянутым ранее.
В то время как групповое индексирует, отключаются, они игнорируются для операторов такой как SELECT
и EXPLAIN
это иначе использовало бы их.
Перед MySQL 5.6.7, используя ALTER TABLE
изменить определение столбца внешнего ключа могло вызвать
потерю ссылочной целостности. Например, изменяя столбец внешнего ключа, который содержал NULL
значения, чтобы быть NOT NULL
вызванный
NULL
значения, чтобы быть пустой строкой. Точно так же ALTER TABLE IGNORE
это удалило строки в родительской таблице, мог
повредить ссылочную целостность.
С 5.6.7, сервер запрещает, что изменения к столбцам внешнего ключа с потенциалом вызывают потерю
ссылочной целостности. Обходное решение должно использовать ALTER TABLE ... DROP FOREIGN KEY
прежде, чем изменить определение
столбца и ALTER TABLE ... ADD FOREIGN
KEY
позже.
FOREIGN KEY
и REFERENCES
пункты поддерживаются
InnoDB
и NDB
механизмы хранения, которые
реализуют ADD [CONSTRAINT [
.
См. Раздел 5.4.5,"symbol
]]
FOREIGN KEY [index_name
] (...) REFERENCES ... (...)InnoDB
и FOREIGN KEY
Ограничения".
Для других механизмов хранения пункты анализируются, но игнорируются. CHECK
пункт анализируется, но игнорируется всеми механизмами хранения. См. Раздел
13.1.17,"CREATE TABLE
Синтаксис". Причина того, чтобы
принять, но проигнорировать пункты синтаксиса для совместимости, чтобы облегчить портировать код от
других SQL-серверов, и запускать приложения, которые составляют таблицы со ссылками. См. Раздел
1.8.5, "SQL MySQL Differences from Standard".
Для ALTER TABLE
, в отличие от этого CREATE TABLE
, ADD FOREIGN KEY
игнорирует
index_name
если дано и использование автоматически
сгенерированное имя внешнего ключа. Как обходное решение, включайте CONSTRAINT
пункт, чтобы определить имя внешнего ключа:
ADD CONSTRAINT name
FOREIGN KEY (....) ...
Встроенное REFERENCES
спецификации, где ссылки
определяются как часть спецификации столбца, тихо игнорируются. MySQL только принимает REFERENCES
пункты, определенные как часть отдельного FOREIGN KEY
спецификация.
Разделенный InnoDB
таблицы не поддерживают внешние ключи.
Это ограничение не применяется к NDB
таблицы, включая явно
разделенных [LINEAR] KEY
. См. Раздел
18.6.2, "Деля Ограничения, Касающиеся Механизмов Хранения", для получения
дополнительной информации.
InnoDB
и NDB
механизмы хранения поддерживают использование ALTER TABLE
отбрасывать внешние ключи:
ALTER TABLEtbl_name
DROP FOREIGN KEYfk_symbol
;
Для получения дополнительной информации см. Раздел
5.4.5,"InnoDB
и FOREIGN KEY
Ограничения".
Невозможно добавить внешний ключ и отбросить внешний ключ в отдельных пунктах
сингла ALTER TABLE
оператор. Следует использовать отдельные операторы.
Для InnoDB
таблица, которая составляется с ее собственной табличной областью в
.ibd
файл, тот файл может быть отброшен и импортирован. Отбрасывать .ibd
файл, используйте этот оператор:
ALTER TABLE tbl_name
DISCARD TABLESPACE;
Это удаляет ток .ibd
файл, так убедиться, что у Вас есть резервное
копирование сначала. Попытка изменить табличное содержание, в то время как файл табличной области
отбрасывается результаты по ошибке. Можно выполнить операции DDL, перечисленные в Разделе
5.5, "Онлайновый DDL для InnoDB
Таблицы", в то время
как файл табличной области отбрасывается.
Импортировать резервное копирование .ibd
файл назад в таблицу,
скопируйте это в каталог базы данных, и затем сделайте это заявление:
ALTER TABLE tbl_name
IMPORT TABLESPACE;
Файл табличной области не должен обязательно быть создан на сервере, в который он импортируется позже. В MySQL 5.6, импортируя файл табличной области из другого сервера работает, если у обоих серверов есть GA (генерал Авэйлэблилити), состояние и их версии в пределах того же самого ряда. Иначе, файл, должно быть, был создан на сервере, в который он импортируется.
Изменить табличный набор символов
значения по умолчанию и все символьные столбцы (CHAR
, VARCHAR
, TEXT
) к новому набору символов используйте оператор как это:
ALTER TABLEtbl_name
CONVERT TO CHARACTER SETcharset_name
;
Для столбца, у которого есть тип данных VARCHAR
или один из TEXT
типы, CONVERT TO CHARACTER SET
изменит тип данных по мере необходимости, чтобы гарантировать, что новый столбец достаточно длинен,
чтобы сохранить так много символов как исходный столбец. Например, a TEXT
у столбца есть два байта длины, которые хранят длиной до
байта из значений в столбце до максимума 65 535. Для a latin1
TEXT
столбец, каждый символ требует единственного байта, таким
образом, столбец может сохранить до 65 535 символов. Если столбец преобразовывается в utf8
, каждый символ мог бы потребовать до трех байтов для
максимальной возможной длины 3 × 65 535 = 196 605 байтов. Та длина не будет помещаться в a TEXT
байты длины столбца, таким образом, MySQL преобразует тип
данных в MEDIUMTEXT
, который является самым маленьким строковым типом, для
которого байты длины могут записать значение 196 605. Точно так же a VARCHAR
столбец мог бы быть преобразован в MEDIUMTEXT
.
Чтобы избежать изменений типа данных типа, только описанного, не использовать CONVERT
TO CHARACTER SET
. Вместо этого используйте MODIFY
изменить
отдельные столбцы. Например:
ALTER TABLE t MODIFY latin1_text_col TEXT CHARACTER SET utf8;ALTER TABLE t MODIFY latin1_varchar_col VARCHAR(M
) CHARACTER SET utf8;
Если Вы определяете CONVERT TO CHARACTER SET binary
, CHAR
, VARCHAR
, и TEXT
столбцы преобразовываются в их соответствующие типы двоичной
строки (BINARY
,
VARBINARY
, BLOB
). Это означает, что у столбцов больше не будет набора
символов и последующего CONVERT TO
работа не будет применяться к ним.
Если charset_name
DEFAULT
,
набор символов базы данных используется.
CONVERT TO
работа преобразовывает значения столбцов между
наборами символов. Это не то, что Вы хотите, если у Вас
есть столбец в одном наборе символов (как latin1
) но сохраненные
значения фактически используют некоторого другого, несовместимый набор символов (как utf8
). В этом случае необходимо сделать следующее для каждого
такого столбца:
ALTER TABLE t1 CHANGE c1 c1 BLOB;ALTER TABLE t1 CHANGE c1 c1 TEXT CHARACTER SET utf8;
Причина это работает, состоит в том, что нет никакого преобразования, когда Вы
преобразовываете в или от BLOB
столбцы.
Чтобы изменить только набор символов значения по умолчанию для таблицы, используйте этот оператор:
ALTER TABLEtbl_name
DEFAULT CHARACTER SETcharset_name
;
Слово DEFAULT
является дополнительным. Набор символов значения по
умолчанию является набором символов, который используется, если Вы не определяете набор символов для
столбцов, которые Вы добавляете к таблице позже (например, с ALTER TABLE ...
ADD column
).
С mysql_info()
C API-функция, можно узнать, сколькими были скопированы строки ALTER TABLE
, и (когда IGNORE
используется),
сколько строк было удалено из-за дублирования значений уникального ключа. См. Раздел
22.8.7.35,"mysql_info()
".