ALTER TYPE
ALTER TYPE — изменить определение типа
Синтаксис
ALTER TYPEимяOWNER TO {новый_владелец| 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удаляет ссылку на такую функцию. Менять это свойство разрешено только суперпользователям.STORAGEможет принимать значенияplain,extended,externalиmain(их описание можно найти в Разделе 65.2). При этом менять вариантplainна какой-либо другой разрешено только суперпользователям (так как для этого требуется, чтобы функции, реализующие тип на C, поддерживали TOAST), а сменить любое другое значение наplainне разрешается вовсе (так как значения этого типа в базе могут уже храниться в виде TOAST). Заметьте, что изменение этого свойства само по себе не влияет на сохранённые данные, оно меняет только стратегию TOAST по умолчанию, которая будет использоваться для столбцов, создаваемых в будущем. Изменить стратегию TOAST для существующих столбцов позволяет команда ALTER TABLE.
Более подробно эти свойства типов описаны в CREATE TYPE. Заметьте, что везде, где применимо, изменения свойств базового типа будут автоматически отражаться в основанных на этом типе доменах.
Операции 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';
Создание функций двоичного ввода/вывода для существующего базового типа:
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.