Spec-Zone.ru › MySQL 8.4

15.1.9 Оператор ALTER TABLE

  • 15.1.9.1 Операции ALTER TABLE над разделами
  • 15.1.9.2 ALTER TABLE и генерируемые столбцы
  • 15.1.9.3 Примеры 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.20, «Оператор 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_path AS type ARRAY). См. Индексы с несколькими значениями, чтобы узнать подробности о создании индексов с несколькими значениями и использовании, а также ограничениях и ограничениях на индексы с несколькими значениями.

  • С помощью функции C API можно узнать, сколько строк было скопировано оператором ALTER TABLE. См. .

Есть несколько дополнительных аспектов оператора ALTER TABLE, описанных в следующих разделах этого раздела:

  • Параметры таблицы

  • Производительность и требования к объёму

  • Управление одновременностью

  • Добавление и удаление столбцов

  • Переименование, переопределение и переупорядочивание столбцов

  • Первичные ключи и индексы

  • Внешние ключи и другие ограничения

  • Изменение кодовой страницы

  • Импорт таблиц InnoDB

  • Порядок строк для таблиц MyISAM

  • Параметры разбиения

Параметры таблицы

table_options обозначает параметры таблицы, которые могут быть использованы в операторе CREATE TABLE, такие как ENGINE, AUTO_INCREMENT, AVG_ROW_LENGTH, MAX_ROWS, ROW_FORMAT или TABLESPACE.

Описания всех параметров таблицы см. в Разделе 15.1.20, «Оператор 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_name ENGINE=INNODB на существующей таблице InnoDB выполняет операцию “null” ALTER TABLE, которая может использоваться для дефрагментации таблицы InnoDB, как описано в разделе 17.11.4, «Дефрагментация таблицы». Выполнение ALTER TABLE tbl_name FORCE на таблице InnoDB выполняет ту же функцию.

    • ALTER TABLE tbl_name ENGINE=INNODB и ALTER TABLE tbl_name FORCE используют онлайн-DDL. Для получения дополнительной информации см. раздел 17.12, «InnoDB и онлайн-DDL».

    • Результат попытки изменить движок хранения таблицы зависит от доступности желаемого движка хранения и настройки 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 8.4 поддерживает установку опций 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.36, «Оператор RENAME TABLE».) Разрешения, предоставленные для переименованной таблицы, не мигрируются в новое имя. Их необходимо изменить вручную.

  • Операции, изменяющие только метаданные таблицы. Эти операции выполняются немедленно, поскольку сервер не затрагивает содержимое таблицы. К операциям, изменяющим только метаданные, относятся:

    • Переименование столбца. В NDB Cluster эта операция также может выполняться в режиме онлайн.

    • Изменение значения по умолчанию для столбца (за исключением таблиц NDB).

    • Изменение определения столбца типа ENUM или SET путем добавления новых элементов перечисления или множества в конец списка допустимых значений элементов, при условии, что размер хранения типа данных не изменится. Например, добавление элемента в столбец типа SET с 8 элементами изменяет требуемый размер хранения на значение с 1 байта на 2 байта; это требует копирования таблицы. Добавление элементов в середину списка приводит к переиндексации существующих элементов, что требует копирования таблицы.

    • Изменение определения пространственного столбца для удаления атрибута SRID. (Добавление или изменение атрибута SRID требует перестроения и не может быть выполнено на месте, поскольку сервер должен проверить, что все значения имеют указанное значение SRID.)

    • Изменение набора символов столбца, если выполняются следующие условия:

      • Тип данных столбца — CHAR, VARCHAR, тип TEXT или ENUM.

      • Изменение набора символов с utf8mb3 на utf8mb4 или с любого набора символов на binary.

      • Индекс по этому столбцу отсутствует.

    • Изменение столбца, генерируемого столбца, когда выполняются следующие условия:

      • Для таблиц InnoDB операторы, изменяющие сгенерированные хранимые столбцы, но не изменяющие их тип, выражение или необязательность.

      • Для таблиц, не являющихся InnoDB, операторы, изменяющие сгенерированные хранимые или виртуальные столбцы, но не изменяющие их тип, выражение или необязательность.

      Пример такого изменения — изменение комментария к столбцу.

  • Переименование индекса.

  • Добавление или удаление вторичного индекса для таблиц InnoDB и NDB. См. Раздел 17.12.1, «Операции онлайн DDL».

  • Для таблиц NDB, операции добавления и удаления индексов по столбцам переменной длины. Эти операции выполняются онлайн без копирования таблицы и без блокирования одновременных операций DML в течение большей части их выполнения. См. Раздел 25.6.12, «Операции в режиме онлайн с ALTER TABLE в NDB Cluster».

  • Изменение видимости индекса с помощью операции ALTER INDEX.

  • Модификации столбцов таблиц, содержащих сгенерированные столбцы, зависящие от столбцов со значением DEFAULT, если измененные столбцы не участвуют в выражениях сгенерированных столбцов. Например, изменение свойства NULL отдельного столбца можно выполнить на месте без перестроения таблицы.

Операции ALTER TABLE, которые поддерживают алгоритм INSTANT, включают:

  • Добавление столбца. Эта функция обозначается как «Instant ADD COLUMN». Применяются ограничения. См. Раздел 17.12.1, «Операции DDL онлайн».

  • Удаление столбца. Эта функция обозначается как «Instant 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 8.4 поддерживает онлайн-операции, используя тот же синтаксис 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 col_name — это расширение MySQL для стандартного SQL.

Чтобы добавить столбец в определенной позиции в строке таблицы, используйте FIRST или AFTER col_name. По умолчанию столбец добавляется в конец.

Если таблица содержит только один столбец, столбец нельзя удалить. Если вы хотите удалить таблицу, используйте оператор DROP TABLE вместо этого.

Если столбцы удаляются из таблицы, столбцы также удаляются из любого индекса, частью которого они являются. Если все столбцы, составляющие индекс, удаляются, индекс также удаляется. Если вы используете CHANGE или MODIFY для сокращения длины столбца, на котором существует индекс, и полученная длина столбца меньше длины индекса, MySQL автоматически сокращает индекс.

Для ALTER TABLE ... ADD, если столбец имеет значение по умолчанию, основанное на выражении, использующем недетерминированную функцию, оператор может выдать предупреждение или ошибку. Для получения дополнительной информации см. Раздел 13.6, «Значения по умолчанию типов данных» и Раздел 19.1.3.7, «Ограничения репликации с GTID».

Переименование, переопределение и переупорядочение столбцов

Предложения 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.20.10, «Невидимые столбцы».

Первичные ключи и индексы

DROP PRIMARY KEY удаляет . Если первичного ключа нет, возникает ошибка. Подробную информацию об характеристиках производительности первичных ключей, особенно для InnoDB таблиц, см. в Разделе 10.3.2, «Оптимизация первичного ключа».

Если системная переменная sql_require_primary_key включена, попытка удалить первичный ключ приводит к ошибке.

Если вы добавляете UNIQUE INDEX или PRIMARY KEY в таблицу, MySQL сохраняет его перед любым не уникальным индексом, чтобы позволить обнаружение дублирующих ключей как можно раньше.

DROP INDEX удаляет индекс. Это расширение MySQL к стандартному SQL. См. Раздел 15.1.27, «Оператор DROP INDEX». Чтобы определить имена индексов, используйте SHOW INDEX FROM tbl_name.

Некоторые движки хранилищ позволяют указать тип индекса при создании индекса. Синтаксис для спецификатора index_type — USING type_name. Подробнее о USING см. в Разделе 15.1.15, «Оператор CREATE INDEX». Предпочтительное положение — после списка столбцов. Ожидается, что поддержка использования опции перед списком столбцов будет удалена в будущих версиях MySQL.

Значения index_option указывают дополнительные параметры для индекса. USING — один из таких параметров. Подробнее о допустимых значениях index_option см. в Разделе 15.1.15, «Оператор CREATE INDEX».

RENAME INDEX old_index_name TO new_index_name переименовывает индекс. Это расширение MySQL к стандартному SQL. Содержимое таблицы остаётся неизменным. 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 для обновления информации о кардинальности индексов. См. Раздел 15.7.7.23, «Оператор SHOW INDEX».

Операция ALTER INDEX позволяет сделать индекс видимым или невидимым. Невидимый индекс не используется оптимизатором. Изменение видимости индексов применяется к индексам, отличным от первичных ключей (явных или неявных), и не может быть выполнено с помощью ALGORITHM=INSTANT. Эта функция не зависит от движка хранилища (поддерживается для любого движка). Дополнительную информацию см. в Разделе 10.3.12, «Невидимые индексы».

Внешние ключи и другие ограничения

Оператор FOREIGN KEY и REFERENCES поддерживаются движками хранения InnoDB и NDB, которые реализуют ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (...) REFERENCES ... (...). См. Раздел 15.1.20.5, «Ограничения FOREIGN KEY». Для других движков хранения операторы обрабатываются, но игнорируются.

Для 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_name изменяет имена ограничений внешних ключей, сгенерированные внутренне, и имена ограничений внешних ключей, определенные пользователем, начинающиеся с строки “tbl_name_ibfk_”, чтобы отразить новое имя таблицы. InnoDB интерпретирует имена ограничений внешних ключей, начинающиеся со строки “tbl_name_ibfk_”, как сгенерированные внутренне.

ALTER TABLE позволяет добавлять, удалять или изменять ограничения CHECK для существующих таблиц:

  • Добавить новое ограничение CHECK:

    ALTER TABLE tbl_name
        ADD [CONSTRAINT [symbol]] CHECK (expr) [[NOT] ENFORCED];
    

    Значение элементов синтаксиса ограничений такое же, как и для CREATE TABLE. См. Раздел 15.1.20.6 «Ограничения CHECK».

  • Удалить существующее ограничение CHECK с именем symbol:

    ALTER TABLE tbl_name
        DROP CHECK symbol;
    
  • Изменить, выполняется ли существующее ограничение CHECK с именем symbol:

    ALTER TABLE tbl_name
        ALTER CHECK symbol [NOT] ENFORCED;
    

Клаузы DROP CHECK и ALTER CHECK являются расширениями MySQL для стандартного SQL.

ALTER TABLE допускает более общий (и стандартный для SQL) синтаксис для удаления и изменения существующих ограничений любого типа, где тип ограничения определяется по имени ограничения:

  • Удалить существующее ограничение с именем symbol:

    ALTER TABLE tbl_name
        DROP CONSTRAINT symbol;
    

    Если системная переменная sql_require_primary_key включена, попытка удалить первичный ключ приведет к ошибке.

  • Изменить, выполняется ли существующее ограничение с именем symbol:

    ALTER TABLE tbl_name
        ALTER CONSTRAINT symbol [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_name изменяет сгенерированные внутренне и определенные пользователем имена ограничений CHECK, начинающиеся со строки “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.20, «Утверждение CREATE TABLE» и Разделе 15.1.9.1, «Операции ALTER TABLE для разбиения». Сведения о заявлениях ALTER TABLE ... EXCHANGE PARTITION и примеры см. в Разделе 26.3.3, «Обмен разбиениями и подразбиениями с таблицами».

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/alter-table.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API