Ответ
Да, использовал. ENUM в PostgreSQL — это пользовательский тип, который задает фиксированный набор допустимых строковых значений для столбца.
Преимущества и сценарии использования:
- Целостность данных: Гарантирует, что в столбец не попадет некорректное значение. Лучше, чем
CHECK (status IN ('new', 'in_progress', 'done')), так как тип определяется централизованно. - Эффективность хранения: Значения хранятся как 4-байтные целые числа, что компактнее, чем текст.
- Читаемость запросов:
WHERE status = 'active'понятнее, чемWHERE status_id = 1.
Пример из практики — статус заказа:
-- 1. Создаем тип
CREATE TYPE order_status AS ENUM ('pending', 'processing', 'shipped', 'delivered', 'cancelled');
-- 2. Используем в таблице
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
customer_id INT NOT NULL,
status order_status NOT NULL DEFAULT 'pending',
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- 3. Вставка и выборка
INSERT INTO orders (customer_id, status) VALUES (1, 'processing');
SELECT * FROM orders WHERE status = 'shipped';
-- Сортировка работает по порядку объявления значений в ENUM
SELECT * FROM orders ORDER BY status;
Важные нюансы:
- Изменить список значений существующего ENUM (
ALTER TYPE ... ADD VALUE) можно, но только добавив новое значение в конец. Удалить или изменить порядок значений сложно — часто требуется создание нового типа и миграция данных. - Для часто меняющихся справочников (например, список стран) лучше использовать отдельную таблицу со связью по внешнему ключу.