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 удаляет ссылку на такую функцию. Для изменения этого свойства требуются права суперпользователя.

  • STORAGE может принимать значения plain, extended, external или main (более подробную информацию о том, что они означают, см. в разделе TOAST). Однако для изменения значения с plain на все остальные требуются права суперпользователя (поскольку для этого изменения нужно, чтобы все функции, реализующие тип на С, поддерживали 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; другие варианты являются расширениями QHB.


См. также

CREATE TYPE, DROP TYPE