UPSERT (ON CONFLICT)
Вставляет строку или обновляет её при конфликте уникального ключа. Атомарная операция.
INSERT INTO table (cols) VALUES (...) ON CONFLICT (unique_col) DO UPDATE SET col = EXCLUDED.col;
Объяснение
Пример
-- Атомарный счётчик
INSERT INTO page_views (page, views) VALUES ('home', 1)
ON CONFLICT (page) DO UPDATE
SET views = page_views.views + 1;
-- Обновить профиль или создать
INSERT INTO profiles (user_id, bio) VALUES ($1, $2)
ON CONFLICT (user_id) DO UPDATE
SET bio = EXCLUDED.bio, updated_at = NOW();Связанные термины
Анекдоты по теме
PostgreSQL Extensions: — uuid-ossp: генерация UUID — pg_trgm: поиск по подстроке — postgis: геопространственные данные — timescaledb: временные ряды — pg_stat_statements: статистика запросов — hstore: key-value в колонке — pg_cron: cron задачи внутри БД PostgreSQL — это не просто база. Это платформа.
— Что такое триггер? — Код, который выполняется автоматически при INSERT/UPDATE/DELETE. — Пример? — Аудит: при UPDATE employees — записывать старое и новое значение в audit_log. — Риски? — Скрытая логика. Сложно дебажить. Если много триггеров — неожиданные эффекты. — Рекомендация? — Использовать осторожно. Только для infrastructure concerns: аудит, обновление updated_at.
DBA объясняет жене: — Дорогая, я как FOREIGN KEY. Я всегда ссылаюсь на тебя — мою PRIMARY KEY. Жена: — А если я удалюсь? DBA: — Тогда я не смогу существовать. Будет ошибка.