Spec-Zone.ru › MySQL 5.7

13.1.8.2 ALTER TABLE и сгенерированные столбцы

ALTER TABLE операции, разрешённые для сгенерированных столбцов, это ADD, MODIFY и CHANGE.

  • Можно добавить сгенерированные столбцы.

    CREATE TABLE t1 (c1 INT);
    ALTER TABLE t1 ADD COLUMN c2 INT GENERATED ALWAYS AS (c1 + 1) STORED;
    
  • Можно изменить тип данных и выражение сгенерированных столбцов.

    CREATE TABLE t1 (c1 INT, c2 INT GENERATED ALWAYS AS (c1 + 1) STORED);
    ALTER TABLE t1 MODIFY COLUMN c2 TINYINT GENERATED ALWAYS AS (c1 + 5) STORED;
    
  • Можно переименовать или удалить сгенерированные столбцы, если на них не ссылается ни один другой столбец.

    CREATE TABLE t1 (c1 INT, c2 INT GENERATED ALWAYS AS (c1 + 1) STORED);
    ALTER TABLE t1 CHANGE c2 c3 INT GENERATED ALWAYS AS (c1 + 1) STORED;
    ALTER TABLE t1 DROP COLUMN c3;
    
  • Виртуальные сгенерированные столбцы не могут быть изменены на хранимые сгенерированные столбцы, и наоборот. Для решения этой проблемы удалите столбец, а затем добавьте его с новым определением.

    CREATE TABLE t1 (c1 INT, c2 INT GENERATED ALWAYS AS (c1 + 1) VIRTUAL);
    ALTER TABLE t1 DROP COLUMN c2;
    ALTER TABLE t1 ADD COLUMN c2 INT GENERATED ALWAYS AS (c1 + 1) STORED;
    
  • Несгенерированные столбцы могут быть изменены на хранимые, но не на виртуальные сгенерированные столбцы.

    CREATE TABLE t1 (c1 INT, c2 INT);
    ALTER TABLE t1 MODIFY COLUMN c2 INT GENERATED ALWAYS AS (c1 + 1) STORED;
    
  • Хранимые, но не виртуальные сгенерированные столбцы могут быть изменены на несгенерированные столбцы. Значения хранимого сгенерированного столбца станут значениями несгенерированного столбца.

    CREATE TABLE t1 (c1 INT, c2 INT GENERATED ALWAYS AS (c1 + 1) STORED);
    ALTER TABLE t1 MODIFY COLUMN c2 INT;
    
  • ADD COLUMN не является операцией на месте для хранимых столбцов (выполняется без использования временной таблицы), потому что выражение должно быть вычислено сервером. Для хранимых столбцов изменения индексов выполняются на месте, а изменения выражений — нет. Изменения комментариев к столбцам выполняются на месте.

  • Для неразделенных таблиц ADD COLUMN и DROP COLUMN являются операциями на месте для виртуальных столбцов. Однако добавление или удаление виртуального столбца не может быть выполнено на месте в сочетании с другими операциями ALTER TABLE.

    Для разделительных таблиц ADD COLUMN и DROP COLUMN не являются операциями на месте для виртуальных столбцов.

  • InnoDB поддерживает вторичные индексы для виртуальных сгенерированных столбцов. Добавление или удаление вторичного индекса для виртуального сгенерированного столбца является операцией на месте. Более подробную информацию см. в Разделе 13.1.18.8, «Вторичные индексы и сгенерированные столбцы».

  • Когда сгенерированный столбец VIRTUAL добавляется в таблицу или изменяется, не гарантируется, что значения, вычисляемые выражением сгенерированного столбца, не выходят за пределы диапазона для столбца. Это может привести к возвращению несогласованных данных и неожиданным ошибкам в запросах. Для управления проверкой таких столбцов ALTER TABLE поддерживает WITHOUT VALIDATION и WITH VALIDATION предложения:

    • При использовании WITHOUT VALIDATION (по умолчанию, если ни одно из предложений не указано), выполняется операция на месте (если возможно), целостность данных не проверяется, и запрос завершается быстрее. Однако при последующих чтениях из таблицы могут появляться предупреждения или ошибки для столбца, если значения выходят за пределы диапазона.

    • При использовании WITH VALIDATION, ALTER TABLE создает копию таблицы. Если возникает ошибка выхода за пределы диапазона или любая другая ошибка, запрос завершается ошибкой. Поскольку выполняется копирование таблицы, запрос занимает больше времени.

    WITHOUT VALIDATION и WITH VALIDATION разрешены только с ADD COLUMN, CHANGE COLUMN и MODIFY COLUMN операциями. В противном случае возникает ошибка.

  • Начиная с MySQL 5.7.10, если вычисление выражения приводит к обрезке или предоставлению некорректного входного значения для функции, операция ALTER TABLE завершается с ошибкой, и операция DDL отклоняется.

  • Операция ALTER TABLE, изменяющая значение по умолчанию столбца col_name, может также изменить значение выражения сгенерированного столбца, ссылающегося на столбец с использованием DEFAULT(col_name). По этой причине, начиная с MySQL 5.7.13, операции ALTER TABLE, изменяющие определение столбца, вызывают перестроение таблицы, если какое-либо выражение сгенерированного столбца использует DEFAULT().

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

Spec-Zone.ru

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