Тип перечисления ENUM в PostgreSQL.

 Для ситуаций когда значения поля в таблице PostgreSQL имеет ограниченное количество строковых значений, для использования отлично подходит тип Enums, который предварительно создаем, а потом используем при создании поля в таблице.

Создание ENUM.

Рассмотрим на примере таблицы со списком организаций, где одно из полей это тип организации которое может иметь значения ИП или ООО. 

Для такого кейса вначале создаем тип enums с названием `company_type` следующей командой:

CREATE TYPE company_type AS ENUM ('ip', 'ooo');

Если вы используете PgAdmin для PostgreSQL, то можете увидеть вновь созданный тип enum в специальном меню: 

Просмотр всех доступных ENUMS в схеме.

Также можно посмотреть все имеющиеся enums и их допустимые значения в PosgreSQL выполнив SQL запрос:

SELECT n.nspname AS enum_schema,  
       t.typname AS enum_name,  
       e.enumlabel AS enum_value
FROM pg_type t 
   JOIN pg_enum e ON t.oid = e.enumtypid  
   JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace;

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

Использование ENUMS в полях таблиц.

После создания, enums можно использовать для указания типов для полей в таблицах, например при создании таблиц. Так создание простой таблицы для хранения списка компаний с типами ИП и ООО может быть выполнено при помощи SQL команды:

CREATE TABLE public.company
(
    id serial,
    name character varying(256) NOT NULL,
    type company_type NOT NULL,
    description text
);

Добавление новых значений в enum.

Если в справочнике появляются компании с новым типом ПАО, то легко можно добавить новое значение в перечисления enums, с помощью SQL запроса:

ALTER TYPE company_type 
  ADD VALUE 'pao';

После выполнения увидим что у нас появился новое значение для enum company_type.

Особенности работы ENUM в PostgreSQL.

При работе с ENUM стоит учитывать следующие нюансы:

 

  • Значения перечисления чувствительны к регистру, поэтому «ПАО» — это не то же самое, что «пао». Пробелы в значениях тоже имеют значение.
  • Существующие значения enums не могут быть удалены из типа перечисления, а также не может быть изменен порядок сортировки таких значений, за исключением удаления и повторного создания типа перечисления.
  • Значение перечисления enum занимает четыре байта на диске. Длина текстовой метки значения перечисления ограничена настройкой NAMEDATALEN, скомпилированной в PostgreSQL; в стандартных сборках это означает не более 63 байт.

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *