Поддерживает ли PostgreSQL пользовательские типы ENUM?

«Поддерживает ли PostgreSQL пользовательские типы ENUM?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, PostgreSQL имеет полноценную поддержку пользовательских перечисляемых типов (ENUM). Они обеспечивают проверку данных на уровне базы и повышают семантическую ясность схемы.

Создание и использование ENUM:

-- 1. Создать новый ENUM-тип
CREATE TYPE status AS ENUM ('NEW', 'IN_PROGRESS', 'CLOSED');

-- 2. Использовать его в таблице
CREATE TABLE tasks (
    id SERIAL PRIMARY KEY,
    title TEXT NOT NULL,
    current_status status NOT NULL DEFAULT 'NEW'
);

-- 3. Вставка данных (только допустимые значения)
INSERT INTO tasks (title, current_status) VALUES ('Fix bug', 'IN_PROGRESS');

-- Эта вставка вызовет ОШИБКУ:
-- INSERT INTO tasks (title, current_status) VALUES ('Fix bug', 'UNKNOWN');

Ключевые особенности и операции:

  • Порядок и сравнение: Значения сортируются в порядке их объявления при создании типа.
  • Чувствительность к регистру: Значения 'NEW' и 'new' — разные.
  • Модификация типа: Можно добавлять новые значения в конец перечисления.
    ALTER TYPE status ADD VALUE 'ON_HOLD' AFTER 'IN_PROGRESS';
  • Запросы: С ENUM работают все стандартные операторы сравнения (=, >, < и т.д.).

Преимущество: ENUM безопаснее и читаемее, чем текстовые поля с CHECK-ограничением.