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 (более подробную информацию о том, что они означают, см. в разделе 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