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
(их описание можно найти в Разделе 69.2). При этом менять вариантplain
на какой-либо другой разрешено только суперпользователям (так как для этого требуется, чтобы функции, реализующие тип на C, поддерживали 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; другие формы относятся к расширениям Postgres Pro.