Spec-Zone.ru › MySQL 9.2

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.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_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.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_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 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.)

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

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

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

      • Индекса по столбцу нет.

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

      • Для таблиц 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 col_name — это расширение MySQL для стандартного SQL.

Чтобы добавить столбец в определённой позиции в строке таблицы, используйте 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_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.24, «Оператор SHOW INDEX».

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

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

Операторы FOREIGN KEY и REFERENCES поддерживаются типами хранилищ InnoDB и NDB, которые реализуют ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (...) REFERENCES ... (...). См. Раздел 15.1.21.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.21.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.21, «Оператор 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-9.2-en/alter-table.html

Spec-Zone.ru

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