Spec-Zone.ru › MySQL 9.2

15.1.9.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 поддерживает вторичные индексы на виртуальных сгенерированных столбцах. Добавление или удаление вторичного индекса на виртуальном сгенерированном столбце является операцией на месте. Дополнительную информацию см. в Разделе 15.1.21.9, «Вторичные индексы и сгенерированные столбцы».

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

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

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

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

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

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

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

Spec-Zone.ru

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