ALTER TYPE
Изменяет определение типа данных.
Синтаксис
ALTER TYPE <name> <action> [, ... ]
ALTER TYPE <name> OWNER TO <new_owner>
ALTER TYPE <name> RENAME ATTRIBUTE <attribute_name> TO <new_attribute_name> [ CASCADE | RESTRICT ]
ALTER TYPE <name> RENAME TO <new_name>
ALTER TYPE <name> SET SCHEMA <new_schema>
ALTER TYPE <name> ADD VALUE [ IF NOT EXISTS ] <new_enum_value> [ { BEFORE | AFTER } <existing_enum_value> ]
ALTER TYPE <name> SET DEFAULT ENCODING ( <storage_directive> )
где action может быть одним из:
ADD ATTRIBUTE <attribute_name> <data_type> [ COLLATE <collation> ] [ CASCADE | RESTRICT ]
DROP ATTRIBUTE [ IF EXISTS ] <attribute_name> [ CASCADE | RESTRICT ]
ALTER ATTRIBUTE <attribute_name> [ SET DATA ] TYPE <data_type> [ COLLATE <collation> ] [ CASCADE | RESTRICT ]
где storage_directive может быть следующим:
COMPRESSTYPE={ZLIB | ZSTD | RLE_TYPE | NONE}
COMPRESSLEVEL={0-19}
BLOCKSIZE={8192-2097152}
Описание
ALTER TYPE изменяет определение существующего типа данных.
Существует несколько форм:
-
ADD ATTRIBUTE— добавляет новый атрибут к составному типу, используя тот же синтаксис, что иCREATE TYPE. -
DROP ATTRIBUTE [ IF EXISTS ]— удаляет атрибут из составного типа. Если указаноIF EXISTSи атрибут не существует, действие выполняется без ошибки. В этом случае вместо ошибки будет показано уведомление. -
SET DATA TYPE— изменяет тип атрибута составного типа. -
OWNER— изменяет владельца типа. -
RENAME— изменяет имя типа или имя отдельного атрибута составного типа. -
SET SCHEMA— перемещает тип в другую схему. -
ADD VALUE [ IF NOT EXISTS ] [ BEFORE | AFTER ]— добавляет новое значение к типу перечисления (enum). Место нового значения в порядке перечисления может быть указано как до (BEFORE), так и после (AFTER) одного из существующих значений. В противном случае новый элемент добавляется в конец списка значений.Если указано
IF NOT EXISTS, наличие нового значения в типе не вызовет ошибку; будет показано уведомление, но никаких действий предпринято не будет. В противном случае, если новое значение уже существует, возникнет ошибка. -
CASCADE— автоматически распространяет операцию на типизированные таблицы изменяемого типа и их потомков. -
RESTRICT— запрещает операцию, если изменяемый тип является типом типизированной таблицы. Это поведение по умолчанию.
Действия ADD ATTRIBUTE, DROP ATTRIBUTE и ALTER ATTRIBUTE могут быть объединены в список из нескольких изменений, применяемых параллельно.
Например, можно добавить несколько атрибутов и/или изменить тип нескольких атрибутов в одной команде.
Вы можете изменить имя, владельца и схему типа. Вы также можете добавить или обновить параметры хранения для скалярного типа.
Greengage DB не поддерживает добавление параметров хранения для строковых или составных типов.
Необходимо быть владельцем типа данных, чтобы использовать ALTER TYPE.
Чтобы изменить схему типа, необходимо также иметь привилегию CREATE в новой схеме.
Чтобы изменить владельца, необходимо также быть прямым или косвенным членом новой роли владельца, и эта роль должна иметь право CREATE в схеме типа.
Эти ограничения гарантируют, что смена владельца не делает ничего, что нельзя было бы сделать путем удаления и повторного создания типа. Однако суперпользователь может изменить владельца любого типа.
Чтобы добавить атрибут или изменить тип атрибута, необходимо также иметь привилегию USAGE для этого типа данных.
ALTER TYPE … ADD VALUE (форма, добавляющая новое значение к типу перечисления) не может быть выполнена внутри блока транзакции.
Сравнения, включающие добавленное значение перечисления, иногда бывают медленнее, чем сравнения, в которых задействуются только исходные члены типа-перечисления.
Обычно это происходит только в том случае, если BEFORE или AFTER используется для установки позиции сортировки нового значения где-то, кроме конца списка.
Однако иногда это происходит, даже если новое значение добавляется в конец (это случается, если счетчик OID "переполнился" с момента первоначального создания типа перечисления).
Замедление обычно несущественное — если это важно, оптимальную производительность можно восстановить, удалив и создав заново тип перечисления, или выгрузив и перезагрузив базу данных.
Параметры
| Параметр | Описание |
|---|---|
name |
Имя (опционально с указанием схемы) существующего типа, который нужно изменить |
new_name |
Новое имя для типа |
new_owner |
Имя пользователя нового владельца типа |
new_schema |
Новая схема для типа |
attribute_name |
Имя атрибута, который нужно добавить, изменить или удалить |
new_attribute_name |
Новое имя переименовываемого атрибута |
data_type |
Тип данных добавляемого атрибута или новый тип изменяемого атрибута |
new_enum_value |
Новое значение, которое нужно добавить в список значений типа перечисления. Как и все литералы перечисления, оно должно быть заключено в кавычки |
existing_enum_value |
Существующее значение перечисления, непосредственно до или после которого должно быть добавлено новое значение в порядке сортировки типа перечисления. Как и все литералы перечисления, оно должно быть заключено в кавычки |
storage_directive |
Определяет параметры хранения по умолчанию для типа, когда он указан в определении столбца таблицы.
Опции включают
|
Примеры
Переименовать тип данных с именем electronic_mail:
ALTER TYPE electronic_mail RENAME TO email;
Изменить владельца пользовательского типа email на joe:
ALTER TYPE email OWNER TO joe;
Изменить схему пользовательского типа email на customers:
ALTER TYPE email SET SCHEMA customers;
Установить или изменить тип сжатия и уровень сжатия пользовательского типа с именем int33:
ALTER TYPE int33 SET DEFAULT ENCODING (compresstype = zlib, compresslevel = 7);
Добавить новый атрибут типу:
ALTER TYPE compfoo ADD ATTRIBUTE f3 int;
Добавить новое значение типу перечисления в определенную позицию сортировки:
ALTER TYPE colors ADD VALUE 'orange' AFTER 'red';
Совместимость
Формы добавления и удаления атрибутов являются частью стандарта SQL. Остальные формы являются расширениями Greengage DB.