ALTER TYPE
ALTER TYPE — изменить определение типа
Синтаксис
ALTER TYPEимяOWNER TO {новый_владелец| CURRENT_ROLE | CURRENT_USER | SESSION_USER } ALTER TYPEимяRENAME TOновое_имяALTER TYPEимяSET SCHEMAновая_схемаALTER TYPEимяRENAME ATTRIBUTEимя_атрибутаTOновое_имя_атрибута[ CASCADE | RESTRICT ] ALTER TYPEимядействие[, ... ] ALTER TYPEимяADD VALUE [ IF NOT EXISTS ]новое_значение_перечисления[ { BEFORE | AFTER }соседнее_значение_перечисления] ALTER TYPEимяRENAME VALUEсуществующее_значение_перечисленияTOновое_значение_перечисленияALTER TYPEимяSET (свойство=значение[, ... ] ) Гдедействиеможет быть следующим: ADD ATTRIBUTEимя_атрибутатип_данных[ COLLATEправило_сортировки] [ CASCADE | RESTRICT ] DROP ATTRIBUTE [ IF EXISTS ]имя_атрибута[ CASCADE | RESTRICT ] ALTER ATTRIBUTEимя_атрибута[ SET DATA ] TYPEтип_данных[ COLLATEправило_сортировки] [ CASCADE | RESTRICT ]
Описание
ALTER TYPE изменяет определение существующего типа. Эта команда имеет несколько разновидностей: 
- OWNER
- Эта форма меняет владельца типа. 
- RENAME
- Эта форма меняет имя типа. 
- SET SCHEMA
- Эта форма переносит тип в другую схему. 
- RENAME ATTRIBUTE
- Эта форма работает только с составными типами. Она меняет имя отдельного атрибута такого типа. 
- ADD ATTRIBUTE
- Эта форма добавляет в составной тип новый атрибут с тем же синтаксисом, что и - CREATE TYPE.
- DROP ATTRIBUTE [ IF EXISTS ]
- Эта форма удаляет атрибут из составного типа. Если указано - IF EXISTSи атрибут не существует, это не считается ошибкой. В этом случае выдаётся только замечание.
- ALTER ATTRIBUTE ... SET DATA TYPE
- Эта форма меняет тип атрибута составного типа. 
- ADD VALUE [ IF NOT EXISTS ] [ BEFORE | AFTER ]
- Эта форма добавляет новое значение в тип-перечисление. Порядок нового значения в перечислении можно указать, добавив - BEFORE(перед) или- AFTER(после) с одним из существующих значений. Если такое указание отсутствует, новый элемент добавляется в конец списка значений.- С указанием - IF NOT EXISTS, если тип уже содержит новое значение, ошибки не произойдёт: будет выдано замечание и ничего больше. Без этого указания, если такое значение уже представлено, возникнет ошибка.
- RENAME VALUE
- Эта форма переименовывает значение в типе-перечислении. Позиция значения в порядке перечисления при этом не меняется. Если это значение отсутствует или в перечислении уже есть новое имя, выдаётся ошибка. 
-  SET (свойство=значение[, ... ] )
- Эта форма применима только к базовым типам. Она позволяет изменить некоторые свойства типа, которые можно задать в - CREATE TYPE, а именно:- RECEIVEпозволяет задать имя функции двоичного ввода, а значение- NONEудаляет ссылку на такую функцию. Менять это свойство разрешено только суперпользователям.
- SENDпозволяет задать имя функции двоичного вывода, а значение- NONEудаляет ссылку на такую функцию. Менять это свойство разрешено только суперпользователям.
- TYPMOD_INпозволяет задать имя функции, предназначенной для ввода модификатора типа, а значение- NONEудаляет ссылку на такую функцию. Менять это свойство разрешено только суперпользователям.
- TYPMOD_OUTпозволяет задать имя функции, предназначенной для вывода модификатора типа, а значение- NONEудаляет ссылку на такую функцию. Менять это свойство разрешено только суперпользователям.
- ANALYZEпозволяет задать имя функции сбора статистики для этого типа, а значение- NONEудаляет ссылку на такую функцию. Менять это свойство разрешено только суперпользователям.
- SUBSCRIPTпозволяет задать имя функции-обработчика обращения по индексу для этого типа, а значение- NONEудаляет ссылку на такую функцию. Менять это свойство разрешено только суперпользователям.
- STORAGEможет принимать значения- plain,- extended,- externalи- main(их описание можно найти в Разделе 63.2). При этом менять вариант- plainна какой-либо другой разрешено только суперпользователям (так как для этого требуется, чтобы функции, реализующие тип на C, поддерживали TOAST), а сменить любое другое значение на- plainне разрешается вовсе (так как значения этого типа в базе могут уже храниться в виде TOAST). Заметьте, что изменение этого свойства само по себе не влияет на сохранённые данные, оно меняет только стратегию TOAST по умолчанию, которая будет использоваться для столбцов, создаваемых в будущем. Изменить стратегию TOAST для существующих столбцов позволяет команда ALTER TABLE.
 - Более подробно эти свойства типов описаны в CREATE TYPE. Заметьте, что везде, где применимо, изменения свойств базового типа будут автоматически отражаться в основанных на этом типе доменах. 
Операции ADD ATTRIBUTE, DROP ATTRIBUTE и ALTER ATTRIBUTE можно объединить в один список множественных изменений для параллельного выполнения. Например, в одной команде можно добавить сразу несколько атрибутов и/или изменить тип нескольких атрибутов.
Выполнить ALTER TYPE может только владелец соответствующего типа. Чтобы сменить схему типа, необходимо также иметь право CREATE в новой схеме. Чтобы сменить владельца, необходимо иметь право SET ROLE для новой роли-владельца, а эта роль должна иметь право 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';
Создание функций двоичного ввода-вывода для существующего базового типа:
CREATE FUNCTION mytypesend(mytype) RETURNS bytea ...;
CREATE FUNCTION mytyperecv(internal, oid, integer) RETURNS mytype ...;
ALTER TYPE mytype SET (
    SEND = mytypesend,
    RECEIVE = mytyperecv
);Совместимость
Формы команды, предназначенные для добавления и удаления атрибутов, являются частью стандарта SQL; другие формы относятся к расширениям Postgres Pro.