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.