MERGE / UPSERT (varsa güncelle yoksa ekle)
Oracle
MERGE INTO musteri m
USING (SELECT 1 AS id, 'Ali' AS ad, 500 AS bakiye FROM dual) k
ON (m.id = k.id)
WHEN MATCHED THEN
UPDATE SET m.ad = k.ad, m.bakiye = k.bakiye
WHEN NOT MATCHED THEN
INSERT (id, ad, bakiye) VALUES (k.id, k.ad, k.bakiye);MERGE (upsert) bir kaynak ile hedefi eşleştirip eşleşen satırları günceller, eşleşmeyenleri ekler; toplu veri senkronizasyonu için idealdir. Oracle MERGE'i güçlü destekler: WHEN MATCHED ... DELETE ve koşullu güncelleme de yazılabilir. Tek satırlık kaynak için dual tablosu kullanılır.
PostgreSQL
-- PostgreSQL yolu: INSERT ... ON CONFLICT
INSERT INTO musteri (id, ad, bakiye)
VALUES (1, 'Ali', 500)
ON CONFLICT (id) DO UPDATE
SET ad = EXCLUDED.ad, bakiye = EXCLUDED.bakiye;PostgreSQL'in klasik upsert yolu INSERT ... ON CONFLICT (benzersiz sütun) DO UPDATE / DO NOTHING'dir; çakışan satırın yeni değerlerine EXCLUDED takma adıyla erişilir. PostgreSQL 15'ten beri standart MERGE deyimi de desteklenir. ON CONFLICT tek tabloda atomik ve yaygındır.
MySQL
INSERT INTO musteri (id, ad, bakiye)
VALUES (1, 'Ali', 500)
ON DUPLICATE KEY UPDATE
ad = VALUES(ad), bakiye = VALUES(bakiye);MySQL/MariaDB upsert için INSERT ... ON DUPLICATE KEY UPDATE kullanır; unique key veya primary key çakışırsa satır güncellenir. Yeni değerlere VALUES(sutun) (8.0.19+ 'new.sutun' takma adı) ile erişilir. INSERT IGNORE ise çakışmada satırı sessizce atlar. MySQL'de standart MERGE yoktur.
SQL Server
MERGE INTO musteri AS m
USING (VALUES (1, 'Ali', 500)) AS k(id, ad, bakiye)
ON m.id = k.id
WHEN MATCHED THEN
UPDATE SET m.ad = k.ad, m.bakiye = k.bakiye
WHEN NOT MATCHED THEN
INSERT (id, ad, bakiye) VALUES (k.id, k.ad, k.bakiye);SQL Server 2008'den beri MERGE deyimini destekler; WHEN NOT MATCHED BY SOURCE ile hedefte fazlalık satırları silme gibi ek dallar sunar. MERGE deyiminin sonu noktalı virgülle bitmelidir. Not: bazı köşe durum hataları nedeniyle basit upsert'lerde INSERT/UPDATE ayrı yazımı da tercih edilebilir.
MongoDB
// upsert:true ile bul-güncelle veya ekle
db.musteri.updateOne(
{ id: 1 },
{ $set: { ad: "Ali", bakiye: 500 } },
{ upsert: true }
)MongoDB'de upsert doğal bir seçenektir: updateOne/updateMany/findOneAndUpdate çağrısına { upsert: true } eklenirse eşleşen belge güncellenir, yoksa yeni belge oluşturulur. Toplu senkronizasyon için aggregation $merge aşaması (hedef koleksiyona yaz/güncelle) SQL MERGE'e daha yakındır.
Redis
# SET doğal upsert'tir: anahtar varsa üzerine yazar, yoksa oluşturur.
SET musteri:1 '{"ad":"Ali","bakiye":500}'
# Hash alanı güncelle/ekle:
HSET musteri:1 ad Ali bakiye 500Redis'te yazma komutları doğası gereği upsert'tir: SET/HSET anahtar veya alan varsa günceller, yoksa oluşturur. Yalnızca yokken yazmak için SET ... NX, yalnızca varken için XX seçeneği kullanılır. 'varsa güncelle yoksa ekle' ayrımı çoğu komutta zaten varsayılan davranıştır.
Elasticsearch
# Belge id'siyle index çağrısı upsert gibidir (varsa değiştirir):
PUT musteri/_doc/1
{ "ad": "Ali", "bakiye": 500 }
# Kısmi güncelleme + yoksa ekleme:
POST musteri/_update/1
{ "doc": { "bakiye": 500 }, "doc_as_upsert": true }Elasticsearch'te aynı _id ile index (PUT) çağrısı belge varsa tümüyle değiştirir, yoksa oluşturur (upsert benzeri). Kısmi güncelleme ve belge yoksa ekleme için _update API'sinde 'doc_as_upsert': true veya 'upsert' bloğu kullanılır. Script'li upsert de mümkündür.