SQL
UPSERT: вставка или обновление
Идемпотентная запись одной командой — синтаксис для PostgreSQL, MySQL и SQLite.
Код
-- PostgreSQL и SQLite 3.24+
INSERT INTO products (sku, title, price, updated_at)
VALUES ('DM-001', 'Клавиатура', 4900, NOW())
ON CONFLICT (sku) DO UPDATE
SET title = EXCLUDED.title,
price = EXCLUDED.price,
updated_at = EXCLUDED.updated_at
WHERE products.price IS DISTINCT FROM EXCLUDED.price; -- не трогаем, если не изменилось
-- MySQL 8+
INSERT INTO products (sku, title, price)
VALUES ('DM-001', 'Клавиатура', 4900) AS new
ON DUPLICATE KEY UPDATE
title = new.title,
price = new.price;
-- Массовая вставка с игнорированием дублей
INSERT INTO tags (name)
VALUES ('python'), ('django'), ('sql')
ON CONFLICT (name) DO NOTHING;