Перейти к основному содержимому

ALTER TYPE

примечание

Эта страница переведена при помощи нейросети GigaChat.

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 ]
Добавляет новое значение к типу перечисления. Место нового значения в порядке перечисления может быть указано как BEFORE или AFTER одно из существующих значений. В противном случае новый элемент добавляется в конец списка значений.

Если указан IF NOT EXISTS, то ошибка не возникает, если значение уже существует: будет выведено только уведомление. Иначе, если значение уже есть, произойдет ошибка.

RENAME VALUE
Переименовывает значение типа перечисления. Место значения в порядке перечисления не изменяется. Возникнет ошибка, если указанное значение отсутствует или новое имя уже присутствует.
SET (property = value [, ... ])
Применима только к базовым типам. Она позволяет изменить некоторые свойства, задаваемые в CREATE TYPE. В частности, можно изменить:
  • RECEIVE — имя функции бинарного ввода или NONE для удаления. Требует привилегию суперпользователя.
  • SEND — имя функции бинарного вывода или NONE. Требует привилегию суперпользователя.
  • TYPMOD_IN — имя функции ввода модификатора типа или NONE. Требует привилегию суперпользователя.
  • TYPMOD_OUT — имя функции вывода модификатора типа или NONE. Требует привилегию суперпользователя.
  • ANALYZE — имя функции сбора статистики или NONE. Требует привилегию суперпользователя.
  • SUBSCRIPT — имя функции обработки индексации или NONE. Требует привилегию суперпользователя.
  • STORAGE — может быть plain, extended, external или main (смотрите раздел «TOAST»). Переход с plain на другие требует прав суперпользователя (так как требует поддержки TOAST в C-функциях типа), а обратный переход невозможен (из-за возможного наличия TOAST-данных в базе). Эта настройка влияет только на поведение по умолчанию для новых столбцов; для существующих столбцов используйте ALTER TABLE.

Подробнее об этих свойствах смотрите в описании CREATE TYPE. Изменения в базовом типе при необходимости автоматически распространяются на домены, основанные на этом типе.

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

Чтобы использовать ALTER TYPE, необходимо быть владельцем типа. Чтобы переместить тип в другую схему, также нужно иметь привилегию CREATE в этой схеме. Чтобы изменить владельца, необходимо иметь возможность назначить SET ROLE новой роли владельца, и эта роль должна иметь привилегию 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;

Добавление нового значения в тип-перечисление, в определенное положение по порядку:

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