ALTER TYPE
Синтаксис
ALTER TYPE имя действие [, ... ]
ALTER TYPE имя OWNER TO новый_владелец
ALTER TYPE имя RENAME ATTRIBUTE имя_атрибута TO новое_имя_атрибута [ CASCADE | RESTRICT ]
ALTER TYPE имя RENAME TO новое_имя
ALTER TYPE имя SET SCHEMA новая_схема
ALTER TYPE имя ADD VALUE [ IF NOT EXISTS ] новое_значение_перечисления [ { BEFORE | AFTER } существующее_значение_перечисления ]
Где возможные варианты действие:
ADD ATTRIBUTE имя_атрибута тип_данных [ COLLATE правило_сортировки ] [ CASCADE | RESTRICT ]
DROP ATTRIBUTE [ IF EXISTS ] имя_атрибута [ CASCADE | RESTRICT ]
ALTER ATTRIBUTE имя_атрибута [ SET DATA ] TYPE тип_данных [ COLLATE правило_сортировки ] [ CASCADE | RESTRICT ]
Описание
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 ]
Эта форма добавляет новое значение в тип-перечисление. Порядок нового значения в перечислении можно указать, добавив BEFORE (перед) или AFTER (после) с одним из существующих значений. Если такое указание отсутствует, новый элемент добавляется в конец списка значений.
С указанием IF NOT EXISTS, если тип уже содержит новое значение, ошибки не произойдёт: будет выдано замечание и ничего больше. Без этого указания, если такое значение уже представлено, возникнет ошибка.
- CASCADE
Автоматически распространять действие операции на типизированные таблицы, имеющий данный тип, и их потомки.
- RESTRICT
Отказать в выполнении операции, если изменяемый тип является типом типизированной таблицы. Это поведение по умолчанию.
Операции ADD ATTRIBUTE, DROP ATTRIBUTE и ALTER ATTRIBUTE можно объединить в один список множественных изменений для параллельного выполнения. Например, в одной команде можно добавить сразу несколько атрибутов и/или изменить тип нескольких атрибутов.
Выполнить ALTER TYPE может только владелец соответствующего типа. Чтобы сменить схему типа, необходимо также иметь право CREATE в новой схеме. Чтобы сменить владельца, необходимо быть непосредственным или опосредованным членом новой роли-владельца, а эта роль должна иметь право CREATE в схеме типа. (С такими ограничениями при смене владельца не происходит ничего такого, что нельзя было бы сделать, имея право удалить и вновь создать тип. Однако суперпользователь может сменить владельца типа в любом случае.) Чтобы добавить атрибут или изменить тип атрибута, также требуется иметь право USAGE для соответствующего типа данных.
Параметры
- имя
Имя (возможно, дополненное схемой) существующего типа, подлежащего изменению.
- новое_имя
Новое имя типа.
- новый_владелец
Имя пользователя, назначаемого новым владельцем типа.
- новая_схема
Новая схема типа.
- имя_атрибута
Имя атрибута, подлежащего добавлению, изменению или удалению.
- новое_имя_атрибута
Новое имя атрибута
- тип_данных
Тип данных добавляемого атрибута, либо новый тип данных изменяемого атрибута.
- новое_значение_перечисления
Новое значение добавляется в список значений перечисления. Как и все элементы перечисления, оно должно заключаться в кавычки.
- существующее_значение_перечисления
Существующие значение в перечислении, непосредственно перед или после которого по порядку перечисления будет добавлено новое значение. Как и все элементы перечисления, оно должно заключаться в кавычки.
Замечания
ALTER TYPE ... ADD VALUE (форму, добавляющую в тип-перечисление новое значение) нельзя выполнять внутри блока транзакции.
Сравнения с добавленными значениями перечисления иногда бывают медленнее сравнений, в которых задействуются только начальные члены типа-перечисления. Обычно это происходит, только если BEFORE или AFTER устанавливает порядок нового элемента не в конце списка. Однако, иногда это наблюдается даже тогда, когда новое значение добавляется в конец списка (это происходит, если счётчик OID "прокручивается" с момента изначального создания типа-перечисления). Это замедление обычно несущественное, но если это важно, вернуть максимальную производительность можно, удалив и создав заново это перечисление, либо выгрузив копию базы данных и загрузив её вновь.
Примеры
Переименование типа данных:
ALTER TYPE electronic_mail RENAME TO email;
Смена владельца типа email на joe:
ALTER TYPE email OWNER TO joe;
Смена схемы типа email на customers:
ALTER TYPE email SET SCHEMA customers;
Добавление в тип нового атрибута:
ALTER TYPE compfoo ADD ATTRIBUTE f3 int;
Добавление нового значения в тип-перечисление, в определённое положение по порядку:
ALTER TYPE colors ADD VALUE 'orange' AFTER 'red';
Совместимость
Формы команды, предназначенные для добавления и удаления атрибутов, являются частью стандарта SQL; другие формы относятся к расширениям PostgreSQL.
Пред. | Начало | След. |
ALTER TRIGGER | Уровень выше | ALTER USER |