ALTER TYPE
ALTER TYPE — изменить определение типа
Синтаксис
ALTER TYPEимядействие[, ... ] ALTER TYPEимяOWNER TO {новый_владелец| CURRENT_USER | SESSION_USER } ALTER TYPEимяRENAME ATTRIBUTEимя_атрибутаTOновое_имя_атрибута[ CASCADE | RESTRICT ] ALTER TYPEимяRENAME TOновое_имяALTER TYPEимяSET SCHEMAновая_схемаALTER TYPEимяADD VALUE [ IF NOT EXISTS ]новое_значение_перечисления[ { BEFORE | AFTER }соседнее_значение_перечисления] ALTER TYPEимяRENAME VALUEсуществующее_значение_перечисленияTOновое_значение_перечисленияГдедействиеможет быть следующим: 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, если тип уже содержит новое значение, ошибки не произойдёт: будет выдано замечание и ничего больше. Без этого указания, если такое значение уже представлено, возникнет ошибка.
- RENAME VALUE
- Эта форма переименовывает значение в типе-перечислении. Позиция значения в порядке перечисления при этом не меняется. Если это значение отсутствует или в перечислении уже есть новое имя, выдаётся ошибка. 
Операции ADD ATTRIBUTE, DROP ATTRIBUTE и ALTER ATTRIBUTE можно объединить в один список множественных изменений для параллельного выполнения. Например, в одной команде можно добавить сразу несколько атрибутов и/или изменить тип нескольких атрибутов.
Выполнить ALTER TYPE может только владелец соответствующего типа. Чтобы сменить схему типа, необходимо также иметь право CREATE в новой схеме. Чтобы сменить владельца, необходимо быть непосредственным или опосредованным членом новой роли-владельца, а эта роль должна иметь право CREATE в схеме типа. (С такими ограничениями при смене владельца не происходит ничего такого, что нельзя было бы сделать, имея право удалить и вновь создать тип. Однако суперпользователь может сменить владельца типа в любом случае.) Чтобы добавить атрибут или изменить тип атрибута, также требуется иметь право USAGE для соответствующего типа данных.
Параметры
- имя
- Имя (возможно, дополненное схемой) существующего типа, подлежащего изменению. 
- новое_имя
- Новое имя типа. 
- новый_владелец
- Имя пользователя, назначаемого новым владельцем типа. 
- новая_схема
- Новая схема типа. 
- имя_атрибута
- Имя атрибута, подлежащего добавлению, изменению или удалению. 
- новое_имя_атрибута
- Новое имя атрибута 
- тип_данных
- Тип данных добавляемого атрибута, либо новый тип данных изменяемого атрибута. 
- новое_значение_перечисления
- Новое значение добавляется в список значений перечисления или для существующего значения задаётся новое имя. Как и все элементы перечисления, оно должно заключаться в кавычки. 
- соседнее_значение_перечисления
- Существующие значение в перечислении, непосредственно перед или после которого по порядку перечисления будет добавлено новое значение. Как и все элементы перечисления, оно должно заключаться в кавычки. 
- существующее_значение_перечисления
- Существующее значение в перечислении, которое будет переименовано. Как и все элементы перечисления, оно должно заключаться в кавычки. 
- CASCADE
- Автоматически распространять действие операции на типизированные таблицы, имеющий данный тип, и их потомки. 
- RESTRICT
- Отказать в выполнении операции, если изменяемый тип является типом типизированной таблицы. Это поведение по умолчанию. 
Замечания
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';
Переименование значения в перечислении:
ALTER TYPE colors RENAME VALUE 'purple' TO 'mauve';
Совместимость
Формы команды, предназначенные для добавления и удаления атрибутов, являются частью стандарта SQL; другие формы относятся к расширениям Postgres Pro.