Spec-Zone.ru › MySQL 8.4

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.20.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-8.4-en/alter-table-generated-columns.html

Spec-Zone.ru

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