PostgreSQL – Insert … on conflict.

25 Oca by Şahap AŞÇI

PostgreSQL – Insert … on conflict.

Hemen her yazılımda bulunan ‘kayıt varsa güncelle yoksa ekle’ koşullarını PostgreSQL ile yönetmek çok kolay. Geleneksel yöntemlerde, önce bir SELECT deyimi ile kayıt yerinde mi kontrol ederiz, daha sonra duruma göre INSERT veya UPDATE deyimi çalıştırırız. PostgreSQL’de ise bu durumu tek bir INSERT deyimiyle çözebiliriz. Ek olarak geleneksel yönteme göre daha iyi bir performans alırız. ‘kayıt varsa güncelle yoksa ekle’ cümlesinin postgres’çesi ‘kaydı ekle, eğer eklerken şu alan(lar)da bir çakışma olursa güncelle’ şeklindedir.

Kullanımı görmek için bir tablo oluşturalım.

CREATE TABLE upserttest AS 
SELECT * FROM (VALUES (1,'a'), (2,'b')) AS foo(id, value);

Gördüğünüz gibi tabloda bir primary key’imiz bulunmuyor. INSERT .. ON conflict.. deyimini kullanabilmemiz için karşılaştırma alan tanımlarına karşılık gelen bir primary key veya unique index bulunmalı. Bu durum tek bir alan için olabileceği gibi birden fazla alanda tekillik kontrolü için de geçerli.

Deneyelim;

SQL sorgusuyla id’si 1 olan bir kaydı ekle/güncelle yapalım ve hatamızı görelim:

INSERT INTO upserttest VALUES (1, 'a2') 
ON conflict(id) DO
UPDATE SET
  value = excluded.value;

Şimdi primary key’imizi ekleyelim ve tekrar deneyelim.

ALTER TABLE upserttest ADD PRIMARY KEY (id);

Artık bir primary key’imiz var. Tekrar deneyelim ve sonucu görelim.

Id’si 1 olan kaydın value alanının “a2” ye güncellendiğini gördük. Şimdi aynı komutla id’si 3 olan bir kayıt ekleyelim ve yeni kaydı eklenmiş olarak görelim.

Burada dikkat etmemiz gereken bir keyword var; excluded . Tabloya ekleyeceğimiz kaydın değerlerini excluded.alan_adi olarak erişiyoruz. Böylece değerlerimiz aslında sorguda tekrar etmiş olmuyor.

Referans

Loading

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir