SQL

UPSERT: вставка или обновление

Algonexys · 07.08.2026 · 👁 0

Идемпотентная запись одной командой — синтаксис для 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;