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.