ALTER TYPE#

ALTER TYPE

ALTER TYPE

ALTER TYPE — изменить определение типа

Синтаксис

ALTER TYPE name OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }
ALTER TYPE name RENAME TO new_name
ALTER TYPE name SET SCHEMA new_schema
ALTER TYPE name RENAME ATTRIBUTE attribute_name TO new_attribute_name [ CASCADE | RESTRICT ]
ALTER TYPE name action [, ... ]
ALTER TYPE name ADD VALUE [ IF NOT EXISTS ] new_enum_value [ { BEFORE | AFTER } neighbor_enum_value ]
ALTER TYPE name RENAME VALUE existing_enum_value TO new_enum_value
ALTER TYPE name SET ( property = value [, ... ] )

where action is one of:

    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 ]

Описание

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 ]

Эта форма добавляет новое значение в тип enum. Место нового значения в упорядочении enum может быть указано как BEFORE или AFTER одного из существующих значений. В противном случае, новый элемент добавляется в конец списка значений.

Если указано IF NOT EXISTS, то это не является ошибкой, если тип уже содержит новое значение: будет выдано уведомление, но других действий не будет предпринято. В противном случае, если новое значение уже присутствует, произойдет ошибка.

RENAME VALUE

Эта форма переименовывает значение типа enum. Положение значения в упорядочении enum не изменяется. Возникнет ошибка, если указанное значение отсутствует или новое имя уже присутствует.

SET ( property = value [, ... ] )

Эта форма применима только к базовым типам. Она позволяет настроить подмножество свойств базового типа, которые могут быть установлены в команде CREATE TYPE. Конкретно, эти свойства могут быть изменены:

  • RECEIVE может быть установлено в имя двоичной входной функции или NONE для удаления двоичной входной функции типа. Использование этой опции требует привилегий суперпользователя.

  • Возможное значение для SEND - это имя функции для вывода двоичных данных, или NONE, чтобы удалить функцию вывода двоичных данных для данного типа. Использование этой опции требует привилегий суперпользователя.

  • TYPMOD_IN может быть установлено в имя функции ввода модификатора типа или NONE, чтобы удалить функцию ввода модификатора типа для данного типа. Для использования этой опции требуется привилегия суперпользователя.

  • TYPMOD_OUT может быть установлено в имя функции вывода модификатора типа или NONE для удаления функции вывода модификатора типа типа. Использование этой опции требует привилегий суперпользователя.

  • ANALYZE может быть установлено в имя функции сбора статистики для конкретного типа или NONE для удаления функции сбора статистики для данного типа. Для использования этой опции требуется привилегия суперпользователя.

  • SUBSCRIPT может быть установлено в имя функции обработчика подсчета индексов для конкретного типа или NONE для удаления функции обработчика подсчета индексов для данного типа. Для использования этой опции требуется привилегия суперпользователя.

  • STORAGE может быть установлено на plain, extended, external, или main (см. Раздел 71.2 для получения дополнительной информации о том, что они означают). Однако, изменение с plain на другую настройку требует привилегий суперпользователя (поскольку это требует, чтобы все C-функции типа были готовы к TOAST), и изменение с другой настройки на plain вообще не разрешено (поскольку тип может уже содержать TOAST-значения в базе данных). Обратите внимание, что изменение этой опции само по себе не изменяет хранящиеся данные, она только устанавливает стратегию TOAST по умолчанию, которая будет использоваться для столбцов таблицы, созданных в будущем. См. ALTER TABLE для изменения стратегии TOAST для существующих столбцов таблицы.

См. CREATE TYPE для получения более подробной информации о свойствах этих типов. Обратите внимание, что при необходимости изменение этих свойств для базового типа будет автоматически распространяться на домены, основанные на этом типе.

Все действия ADD ATTRIBUTE, DROP ATTRIBUTE и ALTER ATTRIBUTE могут быть объединены в список нескольких изменений, которые будут применены параллельно. Например, можно добавить несколько атрибутов и/или изменить тип нескольких атрибутов в одной команде.

Вы должны быть владельцем типа, чтобы использовать ALTER TYPE. Чтобы изменить схему типа, вам также необходимо иметь привилегию CREATE на новой схеме. Чтобы изменить владельца, вы также должны быть прямым или косвенным членом новой роли-владельца, и эта роль должна иметь привилегию CREATE на схему типа. (Эти ограничения обеспечивают, что изменение владельца не делает ничего, что вы не могли бы сделать, удалив и создав тип заново. Однако суперпользователь может все равно изменить владельца любого типа). Чтобы добавить атрибут или изменить тип атрибута, вам также необходимо иметь привилегию USAGE на типе данных атрибута.

Параметры

name

Имя (возможно, с указанием схемы) существующего типа для изменения.

new_name

Новое имя для типа.

new_owner

Имя пользователя нового владельца типа.

new_schema

Новая схема для типа.

attribute_name

Имя атрибута для добавления, изменения или удаления.

new_attribute_name

Новое имя атрибута, которое нужно переименовать.

data_type

Тип данных атрибута для добавления или новый тип атрибута для изменения.

new_enum_value

Новое значение, которое будет добавлено в список значений типа перечисления, или новое имя, которое будет присвоено существующему значению. Как и все литералы перечисления, оно должно быть заключено в кавычки.

neighbor_enum_value

Существующее значение перечисления, перед которым или после которого следует добавить новое значение в порядке сортировки перечисления. Как и все литералы перечисления, оно должно быть заключено в кавычки.

existing_enum_value

Существующее значение перечисления, которое должно быть переименовано. Как и все литералы перечисления, оно должно быть заключено в кавычки.

property

Имя свойства базового типа, которое требуется изменить; см. выше возможные значения.

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;

Чтобы добавить новое значение в тип enum в определенной позиции сортировки:

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; остальные варианты являются расширениями PostgreSQL.

См. также

CREATE TYPE, DROP TYPE