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.