Лекция
Это продолжение увлекательной статьи про alter table.
...
Раздел « Перемещение таблиц между табличными пространствами с помощью ALTER TABLE» .
ALTER TABLE ... TABLESPACE
операции всегда вызывают полное перестроение таблицы, даже если TABLESPACE
атрибут не изменился по сравнению с предыдущим значением.
ALTER TABLE ... TABLESPACE
синтаксис не поддерживает перемещение таблицы из временного табличного пространства в постоянное табличное пространство.
Предложение DATA DIRECTORY
, которое поддерживается CREATE TABLE ... TABLESPACE
, не поддерживается ALTER TABLE ... TABLESPACE
и игнорируется, если указано.
Дополнительную информацию о возможностях и ограничениях этой TABLESPACE
опции см CREATE TABLE
. В разделе .
MySQL NDB Cluster 7.5.2 и более поздних версий поддерживает параметры NDB_TABLE
настройки для управления балансом разделов таблицы (тип подсчета фрагментов), возможность чтения из любой реплики, полную репликацию или любую их комбинацию как часть комментария к таблице для ALTER TABLE
оператора таким же образом, как и для CREATE TABLE
, как показано в этом примере:
ALTER TABLE t1 COMMENT = "NDB_TABLE=READ_BACKUP=0,PARTITION_BALANCE=FOR_RA_BY_NODE";
Имейте в виду, что ALTER TABLE ... COMMENT ...
все существующие комментарии для таблицы будут отброшены. См. Раздел Установка параметров NDB_TABLE для получения дополнительной информации и примеров.
Чтобы убедиться, что параметры таблицы были изменены должным образом, используйте таблицу SHOW CREATE TABLE
или запросите ее INFORMATION_SCHEMA.TABLES
.
ALTER TABLE
операции обрабатываются по одному из следующих алгоритмов:
COPY
: Операции выполняются с копией исходной таблицы, и данные таблицы копируются из исходной таблицы в новую таблицу построчно. Одновременное использование DML не допускается.
INPLACE
: Операции избегают копирования данных таблицы, но могут перестроить таблицу на месте. Исключительная блокировка метаданных для таблицы может быть взята на короткое время на этапах подготовки и выполнения операции. Обычно поддерживается одновременный DML.
Предложение не ALGORITHM
является обязательным. Если ALGORITHM
предложение опущено, MySQL использует ALGORITHM=INPLACE
механизмы хранения и ALTER TABLE
предложения, которые его поддерживают. В противном случае ALGORITHM=COPY
используется.
Указание ALGORITHM
предложения требует, чтобы операция использовала указанный алгоритм для предложений и механизмов хранения, которые его поддерживают, иначе в противном случае произойдет сбой с ошибкой. Указание ALGORITHM=DEFAULT
аналогично исключению ALGORITHM
предложения.
ALTER TABLE
операции, использующие COPY
алгоритм, ожидают завершения других операций, изменяющих таблицу. После внесения изменений в копию таблицы данные копируются, исходная таблица удаляется, а копия таблицы переименовывается в имя исходной таблицы. Во время выполнения ALTER TABLE
операции исходная таблица доступна для чтения другим сеансам (за исключением, отмеченным вкратце). Обновления и записи в таблицу, запущенные после начала ALTER TABLE
операции, останавливаются до тех пор, пока новая таблица не будет готова, а затем автоматически перенаправляются в новую таблицу. Временная копия таблицы создается в каталоге базы данных исходной таблицы, если она не являетсяRENAME TO
операция, которая перемещает таблицу в базу данных, которая находится в другом каталоге.
Исключением, упомянутым ранее, является то, что ALTER TABLE
блокирует чтение (а не только запись) в момент, когда он готов к установке новой версии .frm
файла таблицы , отбрасывает старый файл и очищает устаревшие структуры таблиц из кешей таблиц и определений таблиц. На этом этапе он должен получить эксклюзивную блокировку. Для этого он ожидает завершения текущих считывателей и блокирует новые операции чтения и записи.
ALTER TABLE
Операция , которая использует COPY
алгоритм предотвращает параллельные операции DML. Параллельные запросы по-прежнему разрешены. То есть операция копирования таблицы всегда включает, по крайней мере, ограничения параллелизма LOCK=SHARED
(разрешить запросы, но не DML). Вы можете дополнительно ограничить параллелизм для операций, поддерживающих это LOCK
предложение, указав LOCK=EXCLUSIVE
, что предотвращает DML и запросы. Для получения дополнительной информации см. Управление параллелизмом .
Чтобы принудительно использовать COPY
алгоритм для ALTER TABLE
операции, которая в противном случае не использовала бы его, включите old_alter_table
системную переменную или укажите ALGORITHM=COPY
. Если существует конфликт между old_alter_table
параметром и ALGORITHM
предложением со значением, отличным от DEFAULT
, то ALGORITHM
предложение имеет приоритет.
Для InnoDB
таблиц ALTER TABLE
операция, использующая COPY
алгоритм для таблицы, находящейся в общем табличном пространстве, может увеличить объем пространства, используемого табличным пространством. Такие операции требуют столько же дополнительного места, сколько данных в таблице плюс индексы. Для таблицы, находящейся в общем табличном пространстве, дополнительное пространство, используемое во время операции, не возвращается обратно в операционную систему, как это происходит для таблицы, которая находится в табличном пространстве файлов на таблицу .
Для получения информации о требованиях к пространству для онлайн-операций DDL см. Раздел 14.13.3, « Требования к пространству для онлайн-DDL » .
ALTER TABLE
операции, которые используют INPLACE
алгоритм, включают:
ALTER TABLE
операции, поддерживаемые InnoDB
онлайн- функцией DDL . См. Раздел 14.13.1, «Операции DDL в сети» .
Переименование таблицы. MySQL переименовывает файлы, соответствующие таблице, tbl_name
без создания копии. (Вы также можете использовать RENAME TABLE
оператор для переименования таблиц. См. Раздел 13.1.33, «Оператор RENAME TABLE» .) Привилегии, предоставленные специально для переименованной таблицы, не переносятся на новое имя. Их нужно менять вручную.
Операции, которые изменяют только метаданные таблицы. Эти операции выполняются немедленно, потому что сервер изменяет только .frm
файл таблицы , но не затрагивает содержимое таблицы. Операции только с метаданными включают:
Переименование столбца.
Изменение значения столбца по умолчанию (кроме NDB
таблиц).
Изменение определения столбца ENUM
или SET
путем добавления новых элементов перечисления или набора в конец списка допустимых значений элементов при условии, что размер хранилища типа данных не изменяется. Например, добавление элемента в SET
столбец, который имеет 8 элементов, изменяет требуемую память для каждого значения с 1 байта до 2 байтов; для этого требуется копия таблицы. Добавление элементов в середину списка приводит к изменению нумерации существующих элементов, для чего требуется копия таблицы.
Переименование индекса.
Добавление или удаление вторичного индекса, для InnoDB
и NDB
таблицы. См. Раздел 14.13, «InnoDB и онлайн-DDL» .
Для NDB
таблиц - операции, которые добавляют и удаляют индексы столбцов переменной ширины. Эти операции выполняются онлайн, без копирования таблиц и без блокировки одновременных действий DML на протяжении большей части их времени. См. Раздел 21.5.11, «Операции в сети с ALTER TABLE в кластере NDB» .
ALTER TABLE
Обновление MySQL 5.5 временные столбцы в формате 5.6 ADD COLUMN
, CHANGE COLUMN
, MODIFY COLUMN
, ADD INDEX
, и FORCE
операций. Это преобразование не может быть выполнено с использованием INPLACE
алгоритма, потому что таблица должна быть перестроена, поэтому указание ALGORITHM=INPLACE
в этих случаях приведет к ошибке. При ALGORITHM=COPY
необходимости уточняйте.
Если ALTER TABLE
операция над многоколоночным индексом, используемым для разделения таблицы, KEY
изменяет порядок столбцов, ее можно выполнить только с помощью ALGORITHM=COPY
.
Предложения WITHOUT VALIDATION
и WITH VALIDATION
влияют на то, ALTER TABLE
выполняется ли операция на месте для модификаций виртуальных сгенерированных столбцов . См. Раздел 13.1.8.2, «ALTER TABLE и сгенерированные столбцы» .
NDB Cluster ранее при поддержке интернет - ALTER TABLE
операции с использованием ONLINE
и OFFLINE
ключевых слов. Эти ключевые слова больше не поддерживаются; их использование вызывает синтаксическую ошибку. MySQL NDB Cluster 7.5 (и более поздние версии) поддерживает онлайн-операции с использованием того же ALGORITHM=INPLACE
синтаксиса, что и для стандартного сервера MySQL. NDB
не поддерживает изменение табличного пространства онлайн. См. Раздел 21.5.11, «Операции в сети с ALTER TABLE в кластере NDB» , для получения дополнительной информации.
ALTER TABLE
с DISCARD ... PARTITION ... TABLESPACE
или IMPORT ... PARTITION ... TABLESPACE
не создает никаких временных таблиц или файлов временных разделов.
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
операции копируют только измененные разделы и не трогают неизмененные.
Для MyISAM
таблиц вы можете ускорить воссоздание индекса (самая медленная часть процесса изменения), установив для myisam_sort_buffer_size
системной переменной высокое значение.
Для ALTER TABLE
операций, которые его поддерживают, вы можете использовать это LOCK
предложение для управления уровнем одновременных операций чтения и записи в таблице во время ее изменения. Указание для этого предложения значения, отличного от значения по умолчанию, позволяет вам потребовать определенный объем одновременного доступа или исключительных прав во время операции изменения и останавливает операцию, если запрошенная степень блокировки недоступна. Параметры этого LOCK
предложения:
LOCK = DEFAULT
Максимальный уровень параллелизма для данного ALGORITHM
предложения (если есть) и ALTER TABLE
операции: разрешить одновременные чтения и записи, если они поддерживаются. Если нет, разрешите одновременное чтение, если оно поддерживается. Если нет, установите монопольный доступ.
LOCK = NONE
Если поддерживается, разрешите одновременное чтение и запись. В противном случае возникает ошибка.
LOCK = SHARED
Если поддерживается, разрешить одновременное чтение, но заблокировать запись. Записи блокируются, даже если параллельные записи поддерживаются механизмом хранения для данного ALGORITHM
предложения (если есть) и ALTER TABLE
операции. Если одновременные чтения не поддерживаются, возникает ошибка.
LOCK = EXCLUSIVE
Обеспечьте эксклюзивный доступ. Это выполняется, даже если параллельные операции чтения / записи поддерживаются механизмом хранения для данного ALGORITHM
предложения (если есть) и ALTER TABLE
операции.
Используйте ADD
для добавления новых столбцов в таблицу и DROP
для удаления существующих столбцов. является расширением MySQL для стандартного SQL. DROP
col_name
Чтобы добавить столбец в определенное место в строке таблицы, используйте FIRST
или . По умолчанию столбец добавляется последним. AFTER
col_name
Если таблица содержит только один столбец, этот столбец нельзя удалить. Если вы собираетесь удалить таблицу, используйте DROP TABLE
вместо этого инструкцию.
Если столбцы удаляются из таблицы, столбцы также удаляются из любого индекса, частью которого они являются. Если все столбцы, составляющие индекс, удаляются, индекс также удаляется.
Предложения CHANGE
, MODIFY
и ALTER
позволяют изменять имена и определения существующих столбцов. У них есть следующие сравнительные характеристики:
CHANGE
:
Можно переименовать столбец и изменить его определение или и то, и другое.
Имеет больше возможностей MODIFY
, но за счет удобства для некоторых операций. CHANGE
требует дважды назвать столбец, если не переименовывает его.
С помощью FIRST
или AFTER
можно изменить порядок столбцов.
MODIFY
:
Можно изменить определение столбца, но не его имя.
Это удобнее, чем CHANGE
изменять определение столбца без его переименования.
С помощью FIRST
или AFTER
можно изменить порядок столбцов.
ALTER
: Используется только для изменения значения столбца по умолчанию.
CHANGE
является расширением MySQL для стандартного SQL. MODIFY
это расширение MySQL для совместимости с Oracle.
Чтобы изменить столбец, чтобы изменить его имя и определение, используйте CHANGE
, указав старое и новое имена и новое определение. Например, чтобы переименовать INT NOT NULL
столбец с a
на b
и изменить его определение для использования BIGINT
типа данных при сохранении NOT NULL
атрибута, сделайте следующее:
ALTER TABLE t1 CHANGE a b BIGINT NOT NULL;
Чтобы изменить определение столбца, но не его имя, используйте CHANGE
или MODIFY
. При CHANGE
синтаксисе требуется два имени столбца, поэтому вы должны указать одно и то же имя дважды, чтобы оставить имя без изменений. Например, чтобы изменить определение столбца b
, сделайте следующее:
ALTER TABLE t1 CHANGE b b INT NOT NULL;
MODIFY
удобнее изменять определение без изменения имени, потому что имя столбца требуется только один раз:
ALTER TABLE t1 MODIFY b INT NOT NULL;
Чтобы изменить имя столбца, но не его определение, используйте CHANGE
. Синтаксис требует определения столбца, поэтому, чтобы оставить определение без изменений, вы должны повторно указать определение, имеющееся у столбца в настоящее время. Например, чтобы переименовать INT NOT NULL
столбец с b
в a
, сделайте следующее:
ALTER TABLE t1 CHANGE b a INT NOT NULL;
Для изменения определения столбца с помощью CHANGE
или MODIFY
определение должно включать тип данных и все атрибуты, которые должны применяться к новому столбцу, кроме атрибутов индекса, таких как PRIMARY KEY
или UNIQUE
. Атрибуты, присутствующие в исходном определении, но не указанные в новом определении, не переносятся. Предположим, что столбец col1
определен как, INT UNSIGNED DEFAULT 1 COMMENT 'my column'
и вы изменяете столбец следующим образом, намереваясь изменить только INT
на BIGINT
:
ALTER TABLE t1 MODIFY col1 BIGINT;
Это оператор изменяет тип данных от INT
к BIGINT
, но и сбрасывает UNSIGNED
, DEFAULT
и COMMENT
атрибуты. Чтобы сохранить их, инструкция должна включать их явно:
ALTER TABLE t1 MODIFY col1 BIGINT UNSIGNED DEFAULT 1 COMMENT 'my column';
При изменении типа данных с помощью CHANGE
или MODIFY
MySQL пытается как можно лучше преобразовать существующие значения столбцов в новый тип.
Это преобразование может привести к изменению данных. Например, если вы сократите строковый столбец, значения могут быть усечены. Чтобы предотвратить успешное выполнение операции, если преобразование в новый тип данных приведет к потере данных, включите строгий режим SQL перед использованием ALTER TABLE
(см. Раздел 5.1.10, «Режимы SQL сервера» ).
Если вы используете CHANGE
или MODIFY
для сокращения столбца, для которого существует индекс в столбце, а результирующая длина столбца меньше длины индекса, MySQL автоматически сокращает индекс.
Для столбцов, переименованных в CHANGE
, MySQL автоматически переименовывает эти ссылки в переименованный столбец:
Индексы, относящиеся к старому столбцу, включая индексы и отключенные MyISAM
индексы.
Внешние ключи, относящиеся к старому столбцу.
Для столбцов, переименованных в CHANGE
, MySQL не переименовывает эти ссылки автоматически в переименованный столбец:
Сгенерированные выражения столбца и раздела, которые относятся к переименованному столбцу. Вы должны использовать CHANGE
для переопределения таких выражений в том же ALTER TABLE
операторе, что и тот, который переименовывает столбец.
Представления и сохраненные программы, которые ссылаются на переименованный столбец. Вы должны вручную изменить определение этих объектов, чтобы они ссылались на новое имя столбца.
Чтобы изменить порядок столбцов в таблице, используйте операции FIRST
и AFTER
в CHANGE
или MODIFY
.
ALTER ... SET DEFAULT
либо ALTER ... DROP DEFAULT
укажите новое значение по умолчанию для столбца, либо удалите старое значение по умолчанию, соответственно. Если старое значение по умолчанию удалено и столбец может быть удален NULL
, новое значение по умолчанию будет NULL
. Если столбец не может быть NULL
, MySQL присваивает значение по умолчанию, как описано в Раздел 11.6, «Значения по умолчанию для типов данных» .
DROP PRIMARY KEY
отбрасывает первичный ключ . Если первичного ключа нет, возникает ошибка. Для получения информации о характеристиках производительности первичных ключей, особенно для InnoDB
таблиц, см. Раздел 8.3.2, «Оптимизация первичного ключа» .
Если вы добавляете UNIQUE INDEX
или PRIMARY KEY
в таблицу, MySQL сохраняет ее перед любым неуникальным индексом, чтобы разрешить обнаружение повторяющихся ключей как можно раньше.
DROP INDEX
удаляет индекс. Это расширение MySQL для стандартного SQL. См. Раздел 13.1.25, «Заявление DROP INDEX» . Чтобы определить имена индексов, используйте . SHOW INDEX FROM
tbl_name
Некоторые механизмы хранения позволяют указать тип индекса при создании индекса. Синтаксис index_type
спецификатора . Для получения дополнительной информации см. Раздел 13.1.14, «Оператор CREATE INDEX» . Предпочтительная позиция - после списка столбцов. Вы должны ожидать поддержки использования этой опции до того, как список столбцов будет удален в будущем выпуске MySQL. USING
type_name
USING
index_option
значения определяют дополнительные параметры для индекса. Подробнее о допустимых index_option
значениях см. Раздел 13.1.14, «Оператор CREATE INDEX» .
RENAME INDEX
переименовывает индекс. Это расширение MySQL для стандартного SQL. Содержание таблицы остается без изменений. old_index_name
TO new_index_name
old_index_name
должно быть именем существующего индекса в таблице, который не удаляется тем же ALTER TABLE
оператором. new_index_name
- это новое имя индекса, которое не может дублировать имя индекса в результирующей таблице после применения изменений. Ни одно из названий индексов быть не может PRIMARY
.
Если вы используете ALTER TABLE
для MyISAM
таблицы, все неуникальные индексы создаются в отдельном пакете (как и в случае REPAIR TABLE
). Это должно работать ALTER TABLE
намного быстрее, когда у вас много индексов.
Для MyISAM
таблиц обновлением ключей можно управлять явно. Используется ALTER TABLE ... DISABLE KEYS
для указания MySQL прекратить обновление неуникальных индексов. Затем используйте ALTER TABLE ... ENABLE KEYS
для воссоздания недостающих индексов. MyISAM
делает это с помощью специального алгоритма, который намного быстрее, чем вставка ключей по одному, поэтому отключение ключей перед выполнением операций массовой вставки должно дать значительное ускорение. Для использования ALTER TABLE ... DISABLE KEYS
требуется INDEX
привилегия в дополнение к привилегиям, упомянутым ранее.
Хотя неуникальные индексы отключены, они игнорируются для таких операторов, как SELECT
и, EXPLAIN
которые в противном случае использовали бы их.
После ALTER TABLE
оператора может потребоваться выполнить ANALYZE TABLE
обновление информации о мощности индекса. См. Раздел 13.7.5.22, «Заявление SHOW INDEX» .
FOREIGN KEY
И REFERENCES
положения поддерживаются InnoDB
и NDB
хранения двигателей, которые реализуют . См. Раздел 1.7.3.2, «Ограничения FOREIGN KEY» . Для других механизмов хранения предложения разбираются, но игнорируются. ADD [CONSTRAINT [
symbol
]] FOREIGN KEY [index_name
] (...) REFERENCES ... (...)
Предложение CHECK
ограничения анализируется, но игнорируется всеми механизмами хранения. См. Раздел 13.1.18, «Оператор CREATE TABLE» . Причина принятия, но игнорирования предложений синтаксиса заключается в совместимости, для упрощения переноса кода с других серверов SQL и для запуска приложений, которые создают таблицы со ссылками. См. Раздел 1.7.2, «Отличия MySQL от стандартного SQL» .
Ибо ALTER TABLE
, в отличие от CREATE TABLE
, ADD FOREIGN KEY
игнорирует, index_name
если задано, и использует автоматически сгенерированное имя внешнего ключа. В качестве обходного пути включите CONSTRAINT
предложение, чтобы указать имя внешнего ключа:
ADD CONSTRAINT name FOREIGN KEY (....) ...
MySQL молча игнорирует встроенные REFERENCES
спецификации, где ссылки определены как часть спецификации столбца. MySQL принимает только REFERENCES
пункты, определенные как часть отдельной FOREIGN KEY
спецификации.
Секционированные InnoDB
таблицы не поддерживают внешние ключи. Это ограничение не распространяется на NDB
таблицы, в том числе явно разделенные с помощью [LINEAR] KEY
. Для получения дополнительной информации см. Раздел 22.6.2, «Ограничения секционирования, связанные с механизмами хранения» .
Сервер MySQL и кластер NDB поддерживают использование ALTER TABLE
для удаления внешних ключей:
ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol;
Добавление и удаление внешнего ключа в одном ALTER TABLE
операторе поддерживается, ALTER TABLE ... ALGORITHM=INPLACE
но не поддерживается ALTER TABLE ... ALGORITHM=COPY
.
Сервер запрещает изменения столбцов внешнего ключа, которые могут привести к потере ссылочной целостности. Обходной путь - использовать ALTER TABLE ... DROP FOREIGN KEY
перед изменением определения столбца и ALTER TABLE ... ADD FOREIGN KEY
после него. Примеры запрещенных изменений:
Изменения типа данных столбцов внешнего ключа, которые могут быть небезопасными. Например, изменение VARCHAR(20)
на VARCHAR(30)
разрешено, но изменение на это запрещено, VARCHAR(1024)
потому что это изменяет количество байтов длины, необходимых для хранения отдельных значений.
Изменение NULL
столбца NOT NULL
в нестрогом режиме запрещено, чтобы предотвратить преобразование NULL
значений в нестандартные значения по умолчанию NULL
, для которых нет соответствующих значений в указанной таблице. Операция разрешена в строгом режиме, но если требуется такое преобразование, возвращается ошибка.
ALTER TABLE
изменяет генерируемые внутри имена ограничений внешнего ключа и определенные пользователем имена ограничений внешнего ключа, которые начинаются со строки « tbl_name
RENAME new_tbl_name
tbl_name
_ibfk_ », чтобы отразить новое имя таблицы. InnoDB
интерпретирует имена ограничений внешнего ключа, которые начинаются со строки « tbl_name
_ibfk_ », как имена, сгенерированные внутри.
Для того, чтобы изменить набор символов по умолчанию таблицы и все столбцы символов ( CHAR
, VARCHAR
, TEXT
) в новый набор символов, используйте оператор , как это:
ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;
Этот оператор также изменяет порядок сортировки всех символьных столбцов. Если вы не укажете COLLATE
предложение, чтобы указать, какое
продолжение следует...
Часть 1 Проблемы ALTER TABLE тормозит база данных Mysql и варианты решения
Часть 2 Параметры таблицы - Проблемы ALTER TABLE тормозит база данных Mysql
Часть 3 Требования к производительности и пространству - Проблемы ALTER TABLE тормозит
Часть 4 Отказ от и импорт табличных пространств InnoDB - Проблемы ALTER
Комментарии
Оставить комментарий
Базы данных, знаний и хранилища данных. Big data, СУБД и SQL и noSQL
Термины: Базы данных, знаний и хранилища данных. Big data, СУБД и SQL и noSQL