15.1.9 Заявление ALTER TABLE
ALTER TABLE tbl_name
[alter_option [, alter_option] ...]
[partition_options]
alter_option: {
table_options
| ADD [COLUMN] col_name column_definition
[FIRST | AFTER col_name]
| ADD [COLUMN] (col_name column_definition,...)
| ADD {INDEX | KEY} [index_name]
[index_type] (key_part,...) [index_option] ...
| ADD {FULLTEXT | SPATIAL} [INDEX | KEY] [index_name]
(key_part,...) [index_option] ...
| ADD [CONSTRAINT [symbol]] PRIMARY KEY
[index_type] (key_part,...)
[index_option] ...
| ADD [CONSTRAINT [symbol]] UNIQUE [INDEX | KEY]
[index_name] [index_type] (key_part,...)
[index_option] ...
| ADD [CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (col_name,...)
reference_definition
| ADD [CONSTRAINT [symbol]] CHECK (expr) [[NOT] ENFORCED]
| DROP {CHECK | CONSTRAINT} symbol
| ALTER {CHECK | CONSTRAINT} symbol [NOT] ENFORCED
| ALGORITHM [=] {DEFAULT | INSTANT | INPLACE | COPY}
| ALTER [COLUMN] col_name {
SET DEFAULT {literal | (expr)}
| SET {VISIBLE | INVISIBLE}
| DROP DEFAULT
}
| ALTER INDEX index_name {VISIBLE | INVISIBLE}
| CHANGE [COLUMN] old_col_name new_col_name column_definition
[FIRST | AFTER col_name]
| [DEFAULT] CHARACTER SET [=] charset_name [COLLATE [=] collation_name]
| CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]
| {DISABLE | ENABLE} KEYS
| {DISCARD | IMPORT} TABLESPACE
| DROP [COLUMN] col_name
| DROP {INDEX | KEY} index_name
| DROP PRIMARY KEY
| DROP FOREIGN KEY fk_symbol
| FORCE
| LOCK [=] {DEFAULT | NONE | SHARED | EXCLUSIVE}
| MODIFY [COLUMN] col_name column_definition
[FIRST | AFTER col_name]
| ORDER BY col_name [, col_name] ...
| RENAME COLUMN old_col_name TO new_col_name
| RENAME {INDEX | KEY} old_index_name TO new_index_name
| RENAME [TO | AS] new_tbl_name
| {WITHOUT | WITH} VALIDATION
}
partition_options:
partition_option [partition_option] ...
partition_option: {
ADD PARTITION (partition_definition)
| DROP PARTITION partition_names
| DISCARD PARTITION {partition_names | ALL} TABLESPACE
| IMPORT PARTITION {partition_names | ALL} TABLESPACE
| TRUNCATE PARTITION {partition_names | ALL}
| COALESCE PARTITION number
| REORGANIZE PARTITION partition_names INTO (partition_definitions)
| EXCHANGE PARTITION partition_name WITH TABLE tbl_name [{WITH | WITHOUT} VALIDATION]
| 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 PARTITIONING
}
key_part: {col_name [(length)] | (expr)} [ASC | DESC]
index_type:
USING {BTREE | HASH}
index_option: {
KEY_BLOCK_SIZE [=] value
| index_type
| WITH PARSER parser_name
| COMMENT 'string'
| {VISIBLE | INVISIBLE}
}
table_options:
table_option [[,] table_option] ...
table_option: {
AUTOEXTEND_SIZE [=] value
| AUTO_INCREMENT [=] value
| AVG_ROW_LENGTH [=] value
| [DEFAULT] CHARACTER SET [=] charset_name
| CHECKSUM [=] {0 | 1}
| [DEFAULT] COLLATE [=] collation_name
| COMMENT [=] 'string'
| COMPRESSION [=] {'ZLIB' | 'LZ4' | 'NONE'}
| CONNECTION [=] 'connect_string'
| {DATA | INDEX} DIRECTORY [=] 'absolute path to directory'
| DELAY_KEY_WRITE [=] {0 | 1}
| ENCRYPTION [=] {'Y' | 'N'}
| ENGINE [=] engine_name
| ENGINE_ATTRIBUTE [=] 'string'
| INSERT_METHOD [=] { NO | FIRST | LAST }
| KEY_BLOCK_SIZE [=] value
| MAX_ROWS [=] value
| MIN_ROWS [=] value
| PACK_KEYS [=] {0 | 1 | DEFAULT}
| PASSWORD [=] 'string'
| ROW_FORMAT [=] {DEFAULT | DYNAMIC | FIXED | COMPRESSED | REDUNDANT | COMPACT}
| SECONDARY_ENGINE_ATTRIBUTE [=] 'string'
| STATS_AUTO_RECALC [=] {DEFAULT | 0 | 1}
| STATS_PERSISTENT [=] {DEFAULT | 0 | 1}
| STATS_SAMPLE_PAGES [=] value
| TABLESPACE tablespace_name [STORAGE {DISK | MEMORY}]
| UNION [=] (tbl_name[,tbl_name]...)
}
partition_options:
(see CREATE TABLE options)
ALTER TABLE изменяет структуру таблицы. Например, вы можете добавлять или удалять столбцы, создавать или удалять индексы, изменять тип существующих столбцов или переименовывать столбцы или саму таблицу. Вы также можете изменить такие характеристики, как используемый для таблицы движок хранения или комментарий к таблице.
Чтобы использовать
ALTER TABLE, вам нужны привилегииALTER,CREATEиINSERTдля таблицы. Переименование таблицы требует привилегийALTERиDROPдля старой таблицы, а такжеALTER,CREATEиINSERTдля новой таблицы.После имени таблицы укажите изменения, которые нужно внести. Если никаких изменений не указано,
ALTER TABLEничего не делает.Синтаксис многих разрешенных изменений аналогичен предложениям из
CREATE TABLEзаявления.column_definitionпредложения используют тот же синтаксис дляADDиCHANGE, что и дляCREATE TABLE. Дополнительную информацию можно найти в разделе 15.1.21, «Заявление CREATE TABLE».Слово
COLUMNнеобязательно и может быть опущено, за исключением случаяRENAME COLUMN(чтобы отличить операцию переименования столбца от операции переименования таблицыRENAME).-
Несколько
ADD,ALTER,DROPиCHANGEпредложений разрешено в одном заявленииALTER TABLE, разделенных запятыми. Это расширение MySQL к стандартному SQL, который допускает только одно из каждого предложения в одном заявленииALTER TABLE. Например, чтобы удалить несколько столбцов в одном заявлении, сделайте так:ALTER TABLE t2 DROP COLUMN c, DROP COLUMN d;
Если движок хранения не поддерживает попытку операции
ALTER TABLE, может появиться предупреждение. Такие предупреждения можно отобразить с помощьюSHOW WARNINGS. См. раздел 15.7.7.42, «Заявление SHOW WARNINGS». Сведения по устранению неполадок сALTER TABLEсм. в разделе B.3.6.1, «Проблемы с ALTER TABLE».Дополнительную информацию о генерируемых столбцах см. в разделе 15.1.9.2, «ALTER TABLE и генерируемые столбцы».
Примеры использования см. в разделе 15.1.9.3, «Примеры ALTER TABLE».
InnoDBподдерживает добавление индексов с множественными значениями для столбцов JSON с использованиемkey_partспецификации, которая может быть в форме(CAST. Подробную информацию о создании индексов с множественными значениями и использовании, а также ограничениях и ограничениях индексов с множественными значениями см. в Индексах с множественными значениями.json_pathAStypeARRAY)-
С помощью функции C API вы можете узнать, сколько строк было скопировано
ALTER TABLE. См. .
Несколько дополнительных аспектов заявления ALTER
TABLE описаны в следующих разделах данного раздела:
Параметры таблицы
table_options обозначает параметры таблицы, которые могут быть использованы в заявлении CREATE
TABLE, такие как ENGINE, AUTO_INCREMENT, AVG_ROW_LENGTH, MAX_ROWS, ROW_FORMAT или TABLESPACE.
Описания всех параметров таблицы см. в разделе 15.1.21, «Заявление CREATE TABLE». Однако, ALTER TABLE игнорирует DATA
DIRECTORY и INDEX DIRECTORY, когда они указаны как параметры таблицы. ALTER TABLE разрешает их только как параметры разбиения и требует привилегии FILE.
Использование параметров таблицы с ALTER
TABLE обеспечивает удобный способ изменения характеристик одной таблицы. Например:
-
Если
t1в настоящее время не является таблицейInnoDB, данное утверждение изменяет её движок хранения наInnoDB:ALTER TABLE t1 ENGINE = InnoDB;
См. Раздел 17.6.1.5, «Преобразование таблиц из MyISAM в InnoDB» для рекомендаций при переключении таблиц на движок хранения
InnoDB.При указании предложения
ENGINE,ALTER TABLEперестраивает таблицу. Это верно, даже если таблица уже имеет указанный движок хранения.Выполнение
ALTER TABLEна существующей таблицеtbl_nameENGINE=INNODBInnoDBвыполняет операцию “null”ALTER TABLE, которая может использоваться для фрагментации таблицыInnoDB, как описано в Разделе 17.11.4, «Фрагментация таблицы». ВыполнениеALTER TABLEна таблицеtbl_nameFORCEInnoDBвыполняет ту же функцию.ALTER TABLEиtbl_nameENGINE=INNODBALTER TABLEиспользуют онлайн DDL. Более подробная информация в разделе 17.12, «InnoDB и онлайн DDL».tbl_nameFORCEРезультат попытки изменения движка хранения таблицы зависит от доступности желаемого движка хранения и настройки SQL-режима
NO_ENGINE_SUBSTITUTION, как описано в разделе 7.1.11, «SQL-режимы сервера».Для предотвращения непреднамеренной потери данных,
ALTER TABLEне может использоваться для изменения движка хранения таблицы наMERGEилиBLACKHOLE.
-
Для изменения таблицы
InnoDB, чтобы использовать сжатый формат хранения строк:ALTER TABLE t1 ROW_FORMAT = COMPRESSED;
-
Предложение
ENCRYPTIONвключает или отключает шифрование данных на уровне страниц для таблицыInnoDB. Для включения шифрования необходимо установить и настроить плагин ключей.Если переменная
table_encryption_privilege_checkвключена, для использования предложенияENCRYPTIONс настройкой, отличной от настройки шифрования схемы по умолчанию, требуется привилегияTABLE_ENCRYPTION_ADMIN.ENCRYPTIONтакже поддерживается для таблиц, расположенных в общих табличных пространствах.Для таблиц, расположенных в общих табличных пространствах, шифрование таблицы и табличного пространства должно совпадать.
Опция
ENCRYPTIONподдерживается только движком храненияInnoDB; поэтому она работает только если таблица уже используетInnoDB(и вы не изменяете движок хранения таблицы) или если утверждениеALTER TABLEтакже указываетENGINE=InnoDB. В противном случае утверждение отклоняется.Изменение шифрования таблицы путём перемещения таблицы в другое табличное пространство или изменения движка хранения запрещено без явного указания предложения
ENCRYPTION.Указание предложения
ENCRYPTIONс значением, отличным от'N'или'', запрещено, если таблица использует движок хранения, не поддерживающий шифрование. Попытка создать таблицу без предложенияENCRYPTIONв схеме с включённым шифрованием, используя движок хранения, не поддерживающий шифрование, также запрещена.Более подробная информация в разделе 17.13, «Шифрование данных InnoDB на уровне носителя».
-
Для сброса текущего значения автоинкремента:
ALTER TABLE t1 AUTO_INCREMENT = 13;
Вы не можете сбросить счётчик до значения, меньшего или равного текущему. Для обоих
InnoDBиMyISAM, если значение меньше или равно максимальному значению, в настоящее время находящемуся в колонкеAUTO_INCREMENT, значение сбрасывается до текущего максимального значения колонкиAUTO_INCREMENTплюс один. -
Для изменения набора символов таблицы по умолчанию:
ALTER TABLE t1 CHARACTER SET = utf8mb4;
См. также Изменение набора символов.
-
Для добавления (или изменения) комментария к таблице:
ALTER TABLE t1 COMMENT = 'New table comment';
-
Используйте
ALTER TABLEс опциейTABLESPACEдля перемещения таблицInnoDBмежду существующими табличными пространствами и . См. Перемещение таблиц между табличными пространствами с помощью ALTER TABLE.Операции
ALTER TABLE ... TABLESPACEвсегда приводят к полной перестройке таблицы, даже если атрибутTABLESPACEне изменился по сравнению со своим предыдущим значением.Синтаксис
ALTER TABLE ... TABLESPACEне поддерживает перемещение таблицы из временного табличного пространства в постоянное.Предложение
DATA DIRECTORY, которое поддерживается сCREATE TABLE ... TABLESPACE, не поддерживается сALTER TABLE ... TABLESPACEи игнорируется, если указано.Дополнительную информацию о возможностях и ограничениях опции
TABLESPACEсм. вCREATE TABLE.
-
MySQL NDB Cluster 9.2 поддерживает настройку опций
NDB_TABLEдля управления балансом разделов таблицы (тип фрагмента), возможностью чтения из любого реплики, полным реплицированием или любой комбинацией из них, как часть комментария к таблице для утвержденияALTER TABLEтаким же образом, как дляCREATE TABLE, как показано в этом примере:ALTER TABLE t1 COMMENT = "NDB_TABLE=READ_BACKUP=0,PARTITION_BALANCE=FOR_RA_BY_NODE";
Также можно настроить опции
NDB_COMMENTдля столбцов таблицNDBв качестве части утвержденияALTER TABLE, как в этом примере:ALTER TABLE t1 CHANGE COLUMN c1 c1 BLOB COMMENT = 'NDB_COLUMN=BLOB_INLINE_SIZE=4096,MAX_BLOB_PART_SIZE';Имейте в виду, что
ALTER TABLE ... COMMENT ...отбрасывает любой существующий комментарий к таблице. См. Настройка опций NDB_TABLE для дополнительной информации и примеров. Опции
ENGINE_ATTRIBUTEиSECONDARY_ENGINE_ATTRIBUTEиспользуются для указания атрибутов таблицы, столбцов и индексов для первичных и вторичных движков хранения. Эти опции зарезервированы для будущего использования. Атрибуты индексов изменить нельзя. Индекс необходимо удалить и добавить заново с желаемыми изменениями, что можно выполнить в одном утвержденииALTER TABLE.
Для проверки того, что опции таблицы были изменены как предполагалось, используйте SHOW CREATE TABLE или запросите таблицу схемы данных TABLES.
Производительность и требования к пространству
Операции ALTER TABLE обрабатываются с использованием одного из следующих алгоритмов:
COPY: Операции выполняются на копии исходной таблицы, и данные таблицы копируются из исходной таблицы в новую таблицу строка за строкой. Одновременные DML-операции запрещены.INPLACE: Операции избегают копирования данных таблицы, но могут перестроить таблицу на месте. Исключительная блокировка метаданных таблицы может быть взята на короткое время во время подготовительных и исполнительных фаз операции. Как правило, поддерживаются одновременные DML-операции.INSTANT: Операции только изменяют метаданные в словаре данных. Исключительная блокировка метаданных таблицы может быть взята на короткое время во время исполнительной фазы операции. Данные таблицы не затрагиваются, что делает операции мгновенными. Одновременные DML-операции разрешены.
Для таблиц, использующих движок хранения NDB, эти алгоритмы работают следующим образом:
-
COPY:NDBсоздаёт копию таблицы и изменяет её; обработчик NDB Cluster затем копирует данные между старой и новой версиями таблицы. ЗатемNDBудаляет старую таблицу и переименовывает новую.Иногда это также называют “копированием” или “оффлайн”
ALTER TABLE. -
INPLACE: Узлы данных вносят необходимые изменения; обработчик NDB Cluster не копирует данные и не выполняет других действий.Иногда это также называют “не-копированием” или “онлайн”
ALTER TABLE. INSTANT: Не поддерживаетсяNDB.
См. Раздел 25.6.12, «Операции с ALTER TABLE в режиме онлайн в NDB Cluster» для получения дополнительной информации.
Оператор ALGORITHM необязателен. Если опущено использование ALGORITHM оператора, MySQL использует ALGORITHM=INSTANT для хранилищ данных и ALTER TABLE операторы, которые поддерживают его. В противном случае используется ALGORITHM=INPLACE. Если ALGORITHM=INPLACE не поддерживается, используется ALGORITHM=COPY.
После добавления столбца в разделяемую таблицу с помощью ALGORITHM=INSTANT, больше невозможно выполнять ALTER
TABLE ... EXCHANGE PARTITION над этой таблицей.
Указание оператора ALGORITHM требует использования указанного алгоритма для операторов и хранилищ данных, которые его поддерживают, в противном случае операция завершится с ошибкой. Указание ALGORITHM=DEFAULT эквивалентно опущению оператора ALGORITHM.
ALTER TABLE операции, которые используют алгоритм COPY, ожидают завершения других операций, изменяющих таблицу. После применения изменений к копии таблицы, данные копируются, исходная таблица удаляется, а копия таблицы переименовывается в имя исходной таблицы. Пока выполняется операция ALTER TABLE, исходная таблица доступна для чтения другими сессиями (за исключением указанного ниже случая). Обновления и записи в таблицу, начатые после начала операции ALTER
TABLE, приостанавливаются до готовности новой таблицы, а затем автоматически перенаправляются в новую таблицу. Временная копия таблицы создается в каталоге базы данных исходной таблицы, если это не операция RENAME TO, которая перемещает таблицу в базу данных, расположенную в другом каталоге.
Исключение, о котором говорилось ранее, заключается в том, что операция ALTER TABLE блокирует чтение (а не только запись) в момент готовности к очистке устаревших структур таблицы из кеша таблиц и определений таблиц. В этот момент требуется получить эксклюзивную блокировку. Для этого ожидается завершение текущих операций чтения и блокируются новые операции чтения и записи.
Операция ALTER TABLE, использующая алгоритм COPY, предотвращает одновременные операции DML. Одновременные запросы все же разрешены. То есть операция копирования таблицы всегда включает по крайней мере ограничения по одновременности LOCK=SHARED (разрешены запросы, но не DML). Для дальнейшего ограничения одновременности операций, которые поддерживают оператор LOCK, можно указать LOCK=EXCLUSIVE, который предотвращает DML и запросы. Дополнительную информацию см. в разделе по контролю одновременности.
Чтобы принудительно использовать алгоритм COPY для операции ALTER TABLE, которая в противном случае его не использует, укажите ALGORITHM=COPY или включите системную переменную old_alter_table. Если есть конфликт между значением old_alter_table и оператором ALGORITHM с другим значением, кроме DEFAULT, приоритет имеет оператор ALGORITHM.
Для таблиц InnoDB операция ALTER TABLE, которая использует алгоритм COPY над таблицей, хранящейся в , может увеличить используемое пространство табличного пространства. Такие операции требуют дополнительного пространства, равного объему данных в таблице плюс индексы. Для таблицы, хранящейся в общем табличном пространстве, дополнительное пространство, используемое во время операции, не возвращается в операционную систему, в отличие от таблицы, хранящейся в табличном пространстве.
Сведения о требованиях к пространству для онлайн-операций DDL см. в Разделе 17.12.3, «Требования к пространству для онлайн-операций DDL».
Операции ALTER TABLE, которые поддерживают алгоритм INPLACE, включают:
Операции
ALTER TABLE, поддерживаемые функциейInnoDB. См. Раздел 17.12.1, «Операции DDL в режиме онлайн».Переименование таблицы. MySQL переименовывает файлы, соответствующие таблице
tbl_name, без создания копии. (Также можно использовать операторRENAME TABLEдля переименования таблиц. См. Раздел 15.1.38, «Оператор RENAME TABLE».) Права, предоставленные конкретно для переименованной таблицы, не переносятся на новое имя. Их необходимо изменить вручную.-
Операции, которые изменяют только метаданные таблицы. Эти операции выполняются немедленно, поскольку сервер не затрагивает содержимое таблицы. К операциям, изменяющим только метаданные, относятся:
Переименование столбца. В NDB Cluster эта операция также может выполняться в режиме онлайн.
Изменение значения по умолчанию столбца (за исключением таблиц
NDB).Изменение определения столбца
ENUMилиSETпутем добавления новых элементов перечисления или набора в конец списка допустимых значений, при условии, что размер хранения типа данных не изменяется. Например, добавление элемента в столбецSETс 8 элементами изменяет требуемый размер хранения с 1 байта на 2 байта; для этого требуется копия таблицы. Добавление элементов в середину списка приводит к пересчету существующих элементов, что требует копирования таблицы.Изменение определения пространственного столбца для удаления атрибута
SRID. (Добавление или изменение атрибутаSRIDтребует перестроения и не может быть выполнено на месте, поскольку сервер должен проверить, что все значения имеют указанное значениеSRID.)-
Изменение набора символов столбца, если выполняются следующие условия:
-
Изменение сгенерированного столбца, когда выполняются следующие условия:
Для таблиц
InnoDB, операторы, которые изменяют сгенерированные хранимые столбцы, но не изменяют их тип, выражение или возможность быть NULL.Для таблиц, которые не являются
InnoDB, операторы, которые изменяют сгенерированные хранимые или виртуальные столбцы, но не изменяют их тип, выражение или возможность быть NULL.
Пример такого изменения — изменение комментария к столбцу.
Переименование индекса.
Добавление или удаление вторичного индекса для таблиц
InnoDBиNDB. См. Раздел 17.12.1, «Операции DDL в режиме онлайн».Для таблиц
NDB, операции по добавлению и удалению индексов для столбцов переменной длины. Эти операции происходят в режиме онлайн, без копирования таблицы и без блокировки одновременных операций DML на большую часть их времени выполнения. См. Раздел 25.6.12, «Операции с ALTER TABLE в режиме онлайн в NDB Cluster».Изменение видимости индекса с помощью операции
ALTER INDEX.Изменения столбцов в таблицах, содержащих сгенерированные столбцы, которые зависят от столбцов со значением
DEFAULT, если измененные столбцы не участвуют в выражениях сгенерированных столбцов. Например, изменение свойстваNULLотдельного столбца может быть выполнено на месте без перестроения таблицы.
Операции ALTER TABLE, которые поддерживают алгоритм INSTANT, включают:
Добавление столбца. Эта функция называется “Мгновенное
ADD COLUMN”. Применяются ограничения. См. Раздел 17.12.1, «Операции DDL в режиме онлайн».Удаление столбца. Эта функция называется “Мгновенное
DROP COLUMN”. Применяются ограничения. См. Раздел 17.12.1, «Операции DDL в режиме онлайн».Добавление или удаление виртуального столбца.
Добавление или удаление значения по умолчанию для столбца.
Изменение определения столбца типа
ENUMилиSET. Те же ограничения применяются, что и описаны выше дляALGORITHM=INSTANT.Изменение типа индекса.
Переименование таблицы. Те же ограничения применяются, что и описаны выше для
ALGORITHM=INSTANT.
Для получения дополнительной информации об операциях, поддерживающих ALGORITHM=INSTANT, см. Раздел 17.12.1, «Операции DDL в режиме онлайн».
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 операцию на месте для изменений. См. Раздел 15.1.9.2, «ALTER TABLE и сгенерированные столбцы».
NDB Cluster 9.2 поддерживает онлайн-операции, используя ту же синтаксическую конструкцию ALGORITHM=INPLACE, что и стандартный MySQL Server. NDB не позволяет изменять табличное пространство в режиме онлайн. См. Раздел 25.6.12, «Операции в режиме онлайн с ALTER TABLE в NDB Cluster» для получения дополнительной информации.
При выполнении копирования ALTER TABLE, NDB проверяет, не производилось ли одновременное запись в затронутую таблицу. Если обнаруживаются такие записи, NDB отклоняет оператор ALTER TABLE и генерирует ошибку.
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 = DEFAULT разрешается для операций, использующих ALGORITHM=INSTANT. Другие параметры оператора LOCK не применимы.
Параметры оператора LOCK:
-
LOCK = DEFAULTМаксимальный уровень одновременности для данного оператора
ALGORITHM(если есть) и операцииALTER TABLE: Разрешить одновременные чтение и запись, если это поддерживается. Если нет, разрешить одновременное чтение, если это поддерживается. Если нет, применить эксклюзивный доступ. -
LOCK = NONEЕсли поддерживается, разрешить одновременные чтение и запись. В противном случае возникает ошибка.
-
LOCK = SHAREDЕсли поддерживается, разрешить одновременные чтения, но заблокировать записи. Записи блокируются, даже если одновременные записи поддерживаются хранилищем данных для данного оператора
ALGORITHM(если есть) и операцииALTER TABLE. Если одновременное чтение не поддерживается, возникает ошибка. -
LOCK = EXCLUSIVEПрименить эксклюзивный доступ. Это делается даже если одновременные чтение/запись поддерживаются хранилищем данных для данного оператора
ALGORITHM(если есть) и операцииALTER TABLE.
Добавление и удаление столбцов
Используйте ADD для добавления новых столбцов в таблицу и DROP для удаления существующих столбцов. DROP
— это расширение MySQL для стандартного SQL. col_name
Чтобы добавить столбец в определённой позиции в строке таблицы, используйте FIRST или AFTER
. По умолчанию столбец добавляется последним. col_name
Если таблица содержит только один столбец, его нельзя удалить. Если вы хотите удалить таблицу, используйте оператор DROP TABLE вместо этого.
Если из таблицы удаляются столбцы, эти столбцы также удаляются из любого индекса, в котором они участвуют. Если все столбцы, составляющие индекс, удаляются, индекс также удаляется. Если вы используете CHANGE или MODIFY для сокращения длины столбца, для которого существует индекс на этом столбце, и полученная длина столбца меньше длины индекса, MySQL автоматически укорачивает индекс.
Для ALTER TABLE ... ADD, если столбец имеет значение по умолчанию, которое использует недетерминированную функцию, оператор может сгенерировать предупреждение или ошибку. Для получения дополнительной информации см. Раздел 13.6, «Значения по умолчанию типов данных» и Раздел 19.1.3.7, «Ограничения репликации с GTIDs».
Переименование, переопределение и переупорядочивание столбцов
Операторы CHANGE, MODIFY, RENAME COLUMN и ALTER позволяют изменить имена и определения существующих столбцов. У них есть следующие сравнительные характеристики:
-
CHANGE:Может переименовать столбец и изменить его определение или и то, и другое.
Имеет больше возможностей, чем
MODIFYилиRENAME COLUMN, но это достигается за счёт удобства некоторых операций.CHANGEтребует указания имени столбца дважды, если его не переименовывают, и требует повторного определения столбца, если нужно только переименовать его.С помощью
FIRSTилиAFTERможет переупорядочить столбцы.
-
MODIFY:Может изменить определение столбца, но не его имя.
Более удобно, чем
CHANGE, для изменения определения столбца без переименования его.С помощью
FIRSTилиAFTERможет переупорядочить столбцы.
-
RENAME COLUMN:Может изменить имя столбца, но не его определение.
Более удобно, чем
CHANGE, для переименования столбца без изменения его определения.
ALTER: Используется только для изменения значения по умолчанию столбца.
CHANGE — это расширение MySQL для стандартного SQL. MODIFY и RENAME COLUMN — расширения 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 или RENAME COLUMN. С CHANGE синтаксис требует определения столбца, поэтому для сохранения неизменным определения необходимо повторно указать текущее определение столбца. Например, чтобы переименовать столбец INT NOT NULL со значения b на a, сделайте следующее:
ALTER TABLE t1 CHANGE b a INT NOT NULL;
RENAME COLUMN удобнее для изменения имени без изменения определения, поскольку требуется только старое и новое имя:
ALTER TABLE t1 RENAME COLUMN b TO a;
В общем случае вы не можете переименовать столбец в имя, которое уже существует в таблице. Однако иногда это не так, например, когда вы меняете имена или перемещаете их по циклу. Если таблица имеет столбцы с именами a, b и c, эти операции допустимы:
-- swap a and b
ALTER TABLE t1 RENAME COLUMN a TO b,
RENAME COLUMN b TO a;
-- "rotate" a, b, c through a cycle
ALTER TABLE t1 RENAME COLUMN a TO b,
RENAME COLUMN b TO c,
RENAME COLUMN c TO a;
Для изменения определения столбцов с помощью 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 (см. Раздел 7.1.11, «Режимы SQL сервера»).
Если вы используете CHANGE или MODIFY для сокращения столбца, на котором существует индекс, и полученная длина столбца меньше длины индекса, MySQL автоматически укорачивает индекс.
Для столбцов, переименованных с помощью CHANGE или RENAME COLUMN, MySQL автоматически переименовывает эти ссылки на переименованный столбец:
Индексы, которые ссылаются на старый столбец, включая невидимые индексы и отключенные
MyISAMиндексы.Внешние ключи, которые ссылаются на старый столбец.
Для столбцов, переименованных с помощью CHANGE или RENAME COLUMN, MySQL не автоматически переименовывает эти ссылки на переименованный столбец:
Сгенерированные столбцы и выражения разбиения, которые ссылаются на переименованный столбец. Вы должны использовать
CHANGEдля повторного определения таких выражений в том жеALTER TABLEоператоре, что и оператор переименования столбца.Виды и хранимые программы, которые ссылаются на переименованный столбец. Вы должны вручную изменить определение этих объектов, чтобы они ссылались на новое имя столбца.
Для изменения порядка столбцов в таблице используйте FIRST и AFTER в операциях CHANGE или MODIFY.
ALTER ... SET DEFAULT или ALTER ...
DROP DEFAULT задают новое значение по умолчанию для столбца или удаляют старое значение по умолчанию соответственно. Если старое значение по умолчанию удаляется, и столбец может быть NULL, новым значением по умолчанию является NULL. Если столбец не может быть NULL, MySQL назначает значение по умолчанию, как описано в Разделе 13.6, «Значения по умолчанию типов данных».
ALTER ... SET VISIBLE и ALTER ...
SET INVISIBLE позволяют изменить видимость столбца. См. Раздел 15.1.21.10, «Невидимые столбцы».
Первичные ключи и индексы
DROP PRIMARY KEY удаляет первичный ключ. Если первичного ключа нет, возникает ошибка. Сведения о характеристиках производительности первичных ключей, особенно для таблиц InnoDB, см. в Разделе 10.3.2, «Оптимизация первичного ключа».
Если системная переменная sql_require_primary_key включена, попытка удаления первичного ключа приводит к ошибке.
Если вы добавляете UNIQUE INDEX или PRIMARY
KEY в таблицу, MySQL сохраняет его перед любым не уникальным индексом, чтобы позволить как можно раньше обнаружить дублирующиеся ключи.
DROP INDEX удаляет индекс. Это расширение MySQL для стандартного SQL. См. Раздел 15.1.28, «Оператор DROP INDEX». Для определения имён индексов используйте SHOW INDEX FROM
. tbl_name
Некоторые типы хранилищ позволяют указать тип индекса при создании индекса. Синтаксис для спецификатора index_type является USING
. Подробнее об type_nameUSING см. в Разделе 15.1.15, «Оператор CREATE INDEX». Предпочтительное положение — после списка столбцов. Ожидается, что поддержка использования параметра перед списком столбцов будет удалена в будущей версии MySQL.
Значения index_option задают дополнительные параметры для индекса. USING является одним из таких параметров. Подробности о допустимых значениях index_option см. в Разделе 15.1.15, «Оператор CREATE INDEX».
RENAME INDEX переименовывает индекс. Это расширение MySQL для стандартного SQL. Содержимое таблицы остаётся неизменным. old_index_name TO
new_index_nameold_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 для обновления информации о кардинальности индекса. См. Раздел 15.7.7.24, «Оператор SHOW INDEX».
Операция ALTER INDEX позволяет сделать индекс видимым или невидимым. Невидимый индекс не используется оптимизатором. Изменение видимости индекса применяется к индексам, кроме первичных ключей (явных или неявных), и не может быть выполнено с помощью ALGORITHM=INSTANT. Эта функция нейтральна к типу хранилища (поддерживается любым типом хранилища). Дополнительную информацию см. в Разделе 10.3.12, «Невидимые индексы».
Внешние ключи и другие ограничения
Операторы FOREIGN KEY и REFERENCES поддерживаются типами хранилищ InnoDB и NDB, которые реализуют ADD [CONSTRAINT
[. См. Раздел 15.1.21.5, «Ограничения FOREIGN KEY». Для других типов хранилищ эти операторы разбираются, но игнорируются. symbol]] FOREIGN KEY
[index_name] (...) REFERENCES ...
(...)
Для 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. Для получения дополнительной информации см. Раздел 26.6.2, «Ограничения разбиения, относящиеся к хранилищам данных».
MySQL Server и NDB Cluster поддерживают использование 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_nametbl_name_ibfk_”, чтобы отразить новое имя таблицы. InnoDB интерпретирует имена ограничений внешних ключей, начинающиеся со строки “tbl_name_ibfk_”, как имена, сгенерированные внутри.
ALTER TABLE позволяет CHECK ограничениям существующих таблиц добавляться, удаляться или изменяться:
-
Добавление нового
CHECKограничения:ALTER TABLE
tbl_nameADD [CONSTRAINT [symbol]] CHECK (expr) [[NOT] ENFORCED];Значение элементов синтаксиса ограничения такое же, как для
CREATE TABLE. См. Раздел 15.1.21.6, «Ограничения CHECK». -
Удаление существующего
CHECKограничения с именемsymbol:ALTER TABLE
tbl_nameDROP CHECKsymbol; -
Изменение того, применяется ли существующее
CHECKограничение с именемsymbol:ALTER TABLE
tbl_nameALTER CHECKsymbol[NOT] ENFORCED;
DROP CHECK и ALTER
CHECK — расширения MySQL для стандартного SQL.
ALTER TABLE допускает более общий (и стандартный SQL) синтаксис для удаления и изменения существующих ограничений любого типа, где тип ограничения определяется по имени ограничения:
-
Удалить существующее ограничение с именем
symbol:ALTER TABLE
tbl_nameDROP CONSTRAINTsymbol;Если системная переменная
sql_require_primary_keyвключена, попытка удалить первичный ключ приводит к ошибке. -
Изменить, применяется ли существующее ограничение с именем
symbol:ALTER TABLE
tbl_nameALTER CONSTRAINTsymbol[NOT] ENFORCED;Только
CHECKограничения могут быть изменены на неисполняемые. Все остальные типы ограничений всегда выполняются.
Стандарт SQL предусматривает, что все типы ограничений (первичный ключ, уникальный индекс, внешний ключ, проверка) принадлежат одному и тому же пространству имен. В MySQL каждый тип ограничения имеет собственное пространство имен в схеме. Следовательно, имена каждого типа ограничения должны быть уникальными в рамках схемы, но ограничения разных типов могут иметь одинаковое имя. Когда несколько ограничений имеют одинаковое имя, DROP CONSTRAINT и ADD
CONSTRAINT являются неоднозначными и возникает ошибка. В таких случаях необходимо использовать синтаксис, специфичный для ограничения, для его изменения. Например, используйте DROP PRIMARY KEY или DROP FOREIGN KEY для удаления первичного или внешнего ключа.
Если изменение таблицы вызывает нарушение примененного CHECK ограничения, возникает ошибка, и таблица не изменяется. Примеры операций, которые приводят к ошибке:
Попытки добавить атрибут
AUTO_INCREMENTк столбцу, используемому в ограниченииCHECK.Попытки добавить примененное
CHECKограничение или применить неисполняемоеCHECKограничение, для которого существующие строки нарушают условие ограничения.Попытки изменить, переименовать или удалить столбец, используемый в ограничении
CHECK, если это ограничение также не удаляется в том же выражении. Исключение: ЕслиCHECKограничение ссылается только на один столбец, удаление столбца автоматически удаляет ограничение.
ALTER TABLE изменяет имена ограничений tbl_name RENAME
new_tbl_nameCHECK, сгенерированные внутри и определенные пользователем, начинающиеся со строки “tbl_name_chk_”, чтобы отразить новое имя таблицы. MySQL интерпретирует имена ограничений CHECK, начинающиеся со строки “tbl_name_chk_”, как сгенерированные внутри имена.
Изменение набора символов
Для изменения набора символов по умолчанию таблицы и всех столбцов с символами (CHAR, VARCHAR, TEXT) на новый набор символов используйте такое выражение:
ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;
Выражение также изменяет сортировку всех столбцов с символами. Если вы не указываете никаких COLLATE для указания используемой сортировки, выражение использует сортировку по умолчанию для набора символов. Если эта сортировка не подходит для предполагаемого использования таблицы (например, если она изменится с чувствительной к регистру сортировки на нечувствительную к регистру), укажите сортировку явно.
Для столбца, имеющего тип данных VARCHAR или один из типов TEXT, CONVERT TO
CHARACTER SET изменяет тип данных по мере необходимости, чтобы убедиться, что новый столбец достаточно длинный, чтобы хранить столько же символов, сколько и исходный столбец. Например, столбец TEXT имеет два байта длины, которые хранят длину значений в столбце, до максимального значения 65 535. Для latin1 столбца TEXT, каждый символ требует одного байта, поэтому столбец может хранить до 65 535 символов. Если столбец преобразуется в utf8mb4, каждый символ может потребовать до 4 байтов, что обеспечивает максимальную возможную длину 4 × 65 535 = 262 140 байтов. Эта длина не помещается в байтах длины столбца TEXT, поэтому MySQL преобразует тип данных в MEDIUMTEXT, который является наименьшим типом строки, для которого байты длины могут записывать значение 262 140. Аналогичным образом, столбец VARCHAR может быть преобразован в MEDIUMTEXT.
Чтобы избежать изменений типа данных, описанных выше, не используйте CONVERT TO CHARACTER SET. Вместо этого используйте MODIFY для изменения отдельных столбцов. Например:
ALTER TABLE t MODIFY latin1_text_col TEXT CHARACTER SET utf8mb4;
ALTER TABLE t MODIFY latin1_varchar_col VARCHAR(M) CHARACTER SET utf8mb4;
Если вы укажете CONVERT TO CHARACTER SET binary, столбцы CHAR, VARCHAR и TEXT преобразуются в соответствующие двоичные строковые типы (BINARY, VARBINARY, BLOB). Это означает, что столбцы больше не имеют набора символов, и к ним не применяется последующая операция CONVERT
TO.
Если charset_name имеет значение DEFAULT в операции CONVERT TO CHARACTER
SET, используется набор символов, указанный системной переменной character_set_database.
Операция CONVERT TO преобразует значения столбцов между исходным и указанным наборами символов. Это не то, что вам нужно, если у вас есть столбец с одним набором символов (например, latin1), но хранящиеся значения фактически используют другой, несовместимый набор символов (например, utf8mb4). В этом случае для каждого такого столбца необходимо выполнить следующее:
ALTER TABLE t1 CHANGE c1 c1 BLOB;
ALTER TABLE t1 CHANGE c1 c1 TEXT CHARACTER SET utf8mb4;
Причина, по которой это работает, заключается в том, что преобразования не выполняются при преобразовании в или из столбцов BLOB.
Чтобы изменить только по умолчанию набор символов для таблицы, используйте такое утверждение:
ALTER TABLE tbl_name DEFAULT CHARACTER SET charset_name;
Слово DEFAULT является необязательным. Набор символов по умолчанию — это набор символов, который используется, если вы не указываете набор символов для столбцов, которые вы добавляете в таблицу позже (например, с помощью ALTER TABLE ... ADD
column).
Когда системная переменная foreign_key_checks включена, что является значением по умолчанию, преобразование наборов символов не допускается для таблиц, которые включают строковый столбец, используемый в ограничении внешнего ключа. Обходной путь заключается в отключении foreign_key_checks перед выполнением преобразования набора символов. Необходимо выполнить преобразование для обеих таблиц, участвующих в ограничении внешнего ключа, перед повторной активацией foreign_key_checks. Если вы повторно активируете foreign_key_checks после преобразования только одной из таблиц, операция ON DELETE
CASCADE или ON UPDATE CASCADE может повредить данные в таблице-получателе из-за неявного преобразования, которое происходит во время этих операций (ошибка #45290, ошибка #74816).
Импорт таблиц InnoDB
Таблица InnoDB, созданная в собственном пространстве имен, может быть импортирована из резервной копии или с другого сервера MySQL с использованием DISCARD TABLEPACE и IMPORT TABLESPACE пунктов. Смотрите Раздел 17.6.1.3, «Импорт таблиц InnoDB».
Порядок строк для таблиц MyISAM
ORDER BY позволяет создать новую таблицу со строками в определенном порядке. Этот параметр полезен в первую очередь, если известно, что строки чаще всего запрашиваются в определенном порядке. Используя этот параметр после крупных изменений в таблице, можно повысить производительность. В некоторых случаях это может упростить сортировку для MySQL, если таблица отсортирована по столбцу, по которому вы хотите ее сортировать позже.
Таблица не сохраняет указанный порядок после вставок и удалений.
Синтаксис ORDER BY позволяет указать одно или несколько имен столбцов для сортировки, каждое из которых необязательно может быть дополнено ASC или DESC для указания возрастающего или убывающего порядка сортировки соответственно. По умолчанию используется возрастающий порядок. В качестве критериев сортировки допускаются только имена столбцов; произвольные выражения недопустимы. Этот пункт должен быть указан в последнюю очередь после всех других пунктов.
ORDER BY не имеет смысла для таблиц InnoDB, поскольку InnoDB всегда упорядочивает строки таблицы в соответствии с .
При использовании на разнесенной таблице ALTER TABLE ... ORDER
BY упорядочивает строки только внутри каждого раздела.
Параметры разбиения
partition_options обозначает параметры, которые могут использоваться с разнесенными таблицами для переразбиения, добавления, удаления, удаления, импорта, слияния и разделения разделов, а также для выполнения обслуживания разбиения.
В операторе ALTER TABLE может быть присутствовать пункт PARTITION BY или REMOVE PARTITIONING в дополнение к другим параметрам изменения, но пункты PARTITION
BY или REMOVE PARTITIONING должны быть указаны последними после всех других пунктов. Параметры ADD
PARTITION, DROP PARTITION, DISCARD PARTITION, IMPORT
PARTITION, COALESCE PARTITION, REORGANIZE PARTITION, EXCHANGE
PARTITION, ANALYZE PARTITION, CHECK PARTITION и REPAIR
PARTITION не могут быть объединены с другими параметрами изменения в одном операторе ALTER TABLE, так как указанные параметры действуют только на отдельные разделы.
Для получения дополнительной информации о параметрах разбиения см. Раздел 15.1.21, «Оператор CREATE TABLE» и Раздел 15.1.9.1, «Операции разбиения ALTER TABLE». Сведения об операторах ALTER TABLE ...
EXCHANGE PARTITION и примеры см. в Разделе 26.3.3, «Обмен разделами и подразделами с таблицами».
© 2025 Oracle
Licensed under the GPLv2 License.