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, SQLite | INSERT ... ON CONFLICT (anahtar) DO UPDATE SET ... = excluded.... |
| MySQL | INSERT ... ON DUPLICATE KEY UPDATE ... = VALUES(...) |
| SQL Server, Oracle, BigQuery | MERGE 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;
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.