ALTER TYPE

Изменение определения типа данных.

Синтаксис

ALTER TYPE name action [, ... ]
ALTER TYPE name OWNER TO new_owner
ALTER TYPE name RENAME ATTRIBUTE attribute_name TO new_attribute_name [ CASCADE | RESTRICT ]
ALTER TYPE name RENAME TO new_name
ALTER TYPE name SET SCHEMA new_schema
ALTER TYPE name ADD VALUE [ IF NOT EXISTS ] new_enum_value [ { BEFORE | AFTER } existing_enum_value ]
ALTER TYPE name SET DEFAULT ENCODING ( storage_directive )

где action — один из следующих вариантов:

  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 ]

где storage_directive:

   COMPRESSTYPE={ZLIB | ZSTD | QUICKLZ | RLE_TYPE | NONE}
   COMPRESSLEVEL={0-19}
   BLOCKSIZE={8192-2097152}

Описание

ALTER TYPE изменяет определение существующего типа. Существует несколько подформ:

  • ADD ATTRIBUTE — Добавляет новые свойства к составному типу с использованием той же синтаксической конструкции, что и в команде CREATE TYPE.
  • DROP ATTRIBUTE [ IF EXISTS ] — Удаляет атрибуты из составных типов. Если указано условие IF EXISTS, а свойство не существует, ошибки не возникает. В этом случае выдается уведомление.
  • SET DATA TYPE — Изменяет тип атрибута составного типа.
  • OWNER — Изменяет владельца типа.
  • RENAME — Изменяет имя типа или имя отдельного свойства составного типа.
  • SET SCHEMA — Перемещает тип в другую схему.
  • ADD VALUE [ IF NOT EXISTS ] [ BEFORE | AFTER ] — Добавляет новое значение в перечисляемый тип. Можно указать позицию нового значения в порядке перечисления относительно одного из существующих значений — BEFORE (до) или AFTER (после). В противном случае новое значение будет добавлено в конец списка.
    Если указано IF NOT EXISTS, то ошибка не возникнет, если тип уже содержит данное значение; вместо этого будет выдано уведомление, но никаких других действий выполнено не будет. В противном случае при наличии уже существующего значения произойдёт ошибка.
  • CASCADE — Автоматически распространяет операции на таблицы, использующие данный тип, и их потомков.
  • RESTRICT — Операция отклоняется, если изменяемый тип используется в таблицах. Это значение по умолчанию.

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

Можно изменять схему, владельцев и имена типов. Также можно добавлять или обновлять параметры хранения для скалярных типов.

Примечание: База данных YMatrix не поддерживает добавление параметров хранения для строк или составных типов.

Для использования ALTER TYPE необходимо иметь права на данный тип. Чтобы изменить схему типа, вы также должны обладать привилегией CREATE для новой схемы. Чтобы изменить владельца, вы должны быть прямым или косвенным членом новой роли-владельца, и эта роль должна иметь привилегию CREATE для схемы типа. (Эти ограничения заставляют пользователя, меняющего владельца, не выполнять действия по удалению и повторному созданию типа. Однако суперпользователи могут изменять владельца любого типа.) Для добавления или изменения типа свойства необходимо также иметь привилегию USAGE для соответствующего типа данных.

Команда ALTER TYPE ... ADD VALUE (добавление нового значения в перечисляемый тип) не может выполняться внутри блока транзакции.

Сравнения, включающие расширенные значения перечислений, иногда выполняются медленнее, чем сравнения только с исходными элементами типа enum. Обычно это происходит, когда вы задаёте позицию сортировки нового значения (не в конце списка) с помощью BEFORE или AFTER. Однако иногда замедление наблюдается даже при добавлении значения в конец (это происходит, если счётчик OID «переполнился» с момента первоначального создания типа enum). Тем не менее, снижение производительности обычно незначительно. Если это критично, можно восстановить максимальную производительность, удалив и заново создав тип enum либо выполнив дамп и перезагрузку базы данных.

Параметры

name

  • Имя существующего типа, который требуется изменить (может быть указано с именем схемы).

new_name

  • Новое имя типа.

new_owner

  • Имя пользователя, который станет новым владельцем данного типа.

new_schema

  • Новая схема для типа.

attribute_name

  • Имя атрибута, который нужно добавить, изменить или удалить.

new_attribute_name

  • Новое имя атрибута при переименовании.

data_type

  • Тип данных добавляемого атрибута или новый тип изменяемого атрибута.

new_enum_value

  • Новое значение, которое добавляется в перечисляемый тип.

existing_enum_value

  • Существующее значение перечисления, относительно которого новое значение будет размещено до (BEFORE) или после (AFTER) в порядке сортировки. Как и все текстовые значения перечислений, должно заключаться в кавычки.

storage_directive

  • Определяет параметры хранения по умолчанию для данного типа при его указании в определении столбца таблицы. Допустимые параметры: COMPRESSTYPE, COMPRESSLEVEL и BLOCKSIZE.
    COMPRESSTYPE — Устанавливается в ZLIB (по умолчанию), ZSTD, RLE_TYPE или QUICKLZ1 для выбора типа сжатия.
    COMPRESSLEVEL — Для сжатия ZSTD устанавливается целочисленное значение от 1 (самое быстрое сжатие) до 19 (максимальная степень сжатия). Для ZLIB допустимый диапазон — от 1 до 9. Для RLE_TYPE уровень сжатия может быть установлен от 1 (самое быстрое) до 4 (максимальное соотношение). Уровень сжатия по умолчанию — 1.
    BLOCKSIZE — Размер каждого блока в столбце (в байтах). Значение BLOCKSIZE должно находиться в диапазоне от 8192 до 2097152 байт и быть кратно 8192. Размер блока по умолчанию — 32768.

Примеры

Переименовать тип данных с именем electronic_mail:

ALTER TYPE electronic_mail RENAME TO email;

Изменить владельца пользовательского типа email на joe:

ALTER TYPE email OWNER TO joe;

Переместить пользовательский тип email в схему customers:

ALTER TYPE email SET SCHEMA customers;

Установить или изменить тип сжатия и уровень сжатия для пользовательского типа с именем int33:

ALTER TYPE int33 SET DEFAULT ENCODING (compresstype=zlib, compresslevel=7);

Добавить новое свойство к типу:

ALTER TYPE compfoo ADD ATTRIBUTE f3 int;

Добавить новое значение в перечисляемый тип с указанием конкретной позиции в порядке сортировки:

ALTER TYPE colors ADD VALUE 'orange' AFTER 'red';

Совместимость

Добавление и удаление атрибутов является частью стандарта SQL. Остальные формы являются расширением базы данных YMatrix.

См. также

CREATE TYPE , DROP TYPE