ProgramlamaBackend geliştirici

SQL'de UPDATE, MERGE ve INSERT ... ON DUPLICATE KEY UPDATE komutları arasındaki farkları açıklayın. Hangi durumlarda hangi yaklaşım tercih edilir ve bu araçlar performans ve veri bütünlüğünü nasıl etkiler?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

SQL, bir tabloya veri güncellemeye veya eklemeye yönelik çeşitli yollar sağlar:

  • UPDATE — koşula uyan mevcut kayıtları değiştirir.
  • MERGE (veya UPSERT) — ekleme ve güncelleme mantığını tek bir komut içinde birleştirir: satır bulunursa günceller; bulunmazsa ekler.
  • INSERT ... ON DUPLICATE KEY UPDATE (MySQL) veya INSERT ... ON CONFLICT DO UPDATE (PostgreSQL) — yeni bir satır ekler ve anahtar çakışması durumunda mevcut olanı günceller.

Ne zaman ve ne kullanılmalı:

  • Kayıtların kesinlikle olmadığından eminseniz — INSERT kullanın.
  • Mevcut kayıtları güncellemek için — koşullarla UPDATE kullanın.
  • Kayıtların var olup olmadığını bilmiyorsanız, daha verimli bir şekilde MERGE veya UPSERT kullanmak — bu karmaşıklığı azaltır ve SQL sorgusu sayısını düşürür.
  • UPSERT işlemleri genellikle büyük miktarda kayıt için daha hızlıdır ve yarışmaların önlenmesine yardımcı olur.

Örnek (PostgreSQL):

INSERT INTO employees(id, name, salary) VALUES (1, 'Ivan', 100000) ON CONFLICT (id) DO UPDATE SET salary = EXCLUDED.salary;

Performans ve bütünlük üzerindeki etkisi:

  • Çok sayıda ayrı UPDATE/INSERT, yarışma ve kilitlenmelere yol açabilir.
  • MERGE/UPSERT, büyük ölçekli göç işlerken daha etkili olup atomikliği destekler.

Kandırmaca Soru

Eşsiz bir alan üzerinde UPSERT gerçekleştirmeye çalışırsanız, ancak aynı işlemde aynı satırı hem eklemeye hem de güncellemeye çalışırsanız ne olur?

Doğru cevap: Bir kilit hatası/çatışma olasılığı vardır, çünkü işlem aynı satırı iki kez değiştirmeye çalışır. İşlem tamamlanmayabilir veya veritabanına bağlı olarak deadlock hatası ile sonuçlanabilir.

Örnek:

BEGIN; INSERT INTO users(id, name) VALUES (1, 'Oleg') ON CONFLICT (id) DO UPDATE SET name = EXCLUDED.name; UPDATE users SET name = 'Petr' WHERE id = 1; COMMIT;

Yanlış sıralama ve izolasyon düzeyinde değişiklik çatışması olasılığı vardır.


Hikaye №1

Bir veri göç mantığında SELECT kombinasyonunu kullanarak sonra INSERT veya UPDATE yapıldı, bu da bazen başka bir işlemin verileri önce ayarlamasına ve "duplicate key" hatasına neden oluyordu. Bu, gece veri ihracatında sık sık hatalara yol açtı ve mantığı UPSERT ile değiştirmek gerekti.


Hikaye №2

MySQL projesinde ON DUPLICATE KEY UPDATE uygun şekilde uygulanmadı ve bileşik benzersiz anahtarları hesaba katmadı. Sonuç olarak, bazı veriler güncellenmedi ve kopyalar ortaya çıktı. Sorun, yalnızca üretim ortamında tespit edilebildi.


Hikaye №3

Bir projede kullanıcı verilerini senkronize etmek için UPDATE kullanıldı, bağlanma hataları nedeniyle yeni kullanıcılar için güncelleme atlandı ve bazı verilerin kaybına neden oldu. Analizden sonra MERGE/UPSERT'i tamamen entegre ettik.