Ana içeriğe geç
Kesit SQL
Orta · Veri Değiştirme

UPSERT ve MERGE: varsa güncelle, yoksa ekle

ON CONFLICT, ON DUPLICATE KEY UPDATE, MERGE ve değişen satırları döndürmek.

Uygulamada aç, 5 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

Varsa güncelle, yoksa ekle

Veri yüklerken aynı anahtarlı kayıt zaten olabilir. Her SQL türü bunu farklı yazar; bu ders SQL türü sekmeleri arasındaki farkı görmek için en iyi örneklerden biri:

INSERT INTO departments (dept_id, name, city)
VALUES (7, 'Hukuk ve Uyum', 'Ankara'),
       (12, 'Satın Alma', 'Bursa')
ON CONFLICT (dept_id) DO UPDATE
  SET name = excluded.name, city = excluded.city;
SELECT * FROM departments ORDER BY dept_id;
SQL türüYazım
PostgreSQL, SQLiteINSERT ... ON CONFLICT (anahtar) DO UPDATE SET ... = excluded....
MySQLINSERT ... ON DUPLICATE KEY UPDATE ... = VALUES(...)
SQL Server, Oracle, BigQueryMERGE INTO hedef USING kaynak ON ... WHEN MATCHED ... WHEN NOT MATCHED ...

MERGE en güçlü olanıdır: Kaynakta olmayan hedef satırları silmek için WHEN NOT MATCHED BY SOURCE THEN DELETE (SQL Server) da yazılabilir. PostgreSQL 15+ da MERGE destekler.

Değişen satırları döndürmek

UPDATE products SET stock = stock + 50
WHERE stock < 10
RETURNING product_id, name, stock;
ÖzetPostgreSQL ve SQLite RETURNING, SQL Server OUTPUT inserted.* / deleted.* kullanır. OUTPUT, DELETE'te silinen satırları, UPDATE'te hem eski (deleted) hem yeni (inserted) değerleri verebilir.

Derinleş: upsert ne zaman gerekir?

Bir kaynaktan gelen verinin bir kısmı hedefte zaten varsa ve tekrar çalıştırmanın aynı sonucu vermesi (idempotency) isteniyorsa upsert kullanılır. Yazımlar:

ON CONFLICT için çakışmanın bakılacağı sütunda birincil anahtar ya da benzersiz kısıt olmalıdır.

Alıştırmalara geç (5)