PostgreSQL UPSERT

PostgreSQL UPSERT,PostgreSQL open source  bir veritabanıdır ve bu nedenle gelişime açık ve sürekli geliştirilen veritabanlarından birisidir. PostgreSQL 9.5 ile hayatımıza giren UPSERT özelliği, tabloda  kayıt yoksa insert yapar ,var ise belirtilen kolonu update yapmak için kullanılan kavramdır.

Bunu yaparken tablonuz da en az bir tane unique değer bulunması gerekmektedir.

Örneklere geçmeden önce genel kullanımına bakalım:

INSERT INTO  Tablo_adi (kolon1 ,kolon2,….) VALUES  (DEĞER1,DEGER2,….)
ON CONFLICT  DO NOTHING 
veya 
ON CONFLICT (column_name) DO UPDATE

Yukarıdaki syntax da insert ile başlayan kısım veri eklemek için her zaman kullandığımız insert cümleciği detaylı bilgi için Tabloya kayıt ekleme (INSERT ) isimli yazımı okuyabilirsiniz.

ON CONFLICT  DO NOTHING :

Eklenmek istenen tabloda ki kayıt ile aynı ise işlem yapma anlamına gelmektedir.

 

ON CONFLICT (column_name) DO UPDATE:

 

Eklenmek istenen veri  tabloda var fakat değiştirilmek isteniliyorsa kullanılır.

Uygulama yaparak pekiştirelim.

İlk olarak tablomuzu aupsert  tablomuzu oluşturalım.

CREATE TABLE  aupsert (k1 int unique ,k2 char(10),k3 char(10))

Tablomuza verilerimizi ekleyelim.

INSERT INTO aupsert VALUES (1,'Faruk','ERDEM');
INSERT INTO aupsert VALUES (2,'Ufuk','ERDEM');
INSERT INTO aupsert VALUES (3,'Utku','ERDEM')

Verilerimizi ekledikten sonra tablomuzu sorgulayalım.

Tablomuza aynı isimde kayıt ekleyerek ON CONFLICT  DO NOTHING parametresinde nasıl davranacağını görelim.

Yukarıda “INSERT 0 0 ” şeklinde çıktı verdiğini görmekteyiz. Bunun anlamı tablomuza veri eklenemediğidir.

Verilerimizin eklenemediğini gördük. ON CONFLICT (column_name) DO UPDATE komutunu kullanarak   aynı veriyi eklemeye çalışalım.

INSERT INTO aupsert VALUES (3,'Utku','ER')
ON CONFLICT (k1)
DO    UPDATE SET k2 = EXCLUDED.k2 , k3 = excluded.k3 ;

 

ON CONFLICT(k1 )  parametresi ile unique olan kolonu belirtiyoruz.

DO    UPDATE SET komutunda ise değiştirilmek istenilen kolonları yazıyoruz.

Bu örnekte çıktımız 0 1 şeklinde değişti tablomuzdan select çekerek verimizi kontrol edelim.

Yukarıda görüldüğü gibi k3 kolonunda ki ERDEM olan kaydımızın değiştiğini görüyoruz.

Farklı tablolar arasında upsert kullanabilmek için aşağıdaki örnekten faydalanabilirsiniz.

İlk olarak tablomuzu oluşturalım ve verilerimizi ekleyelim.

CREATE TABLE aupsert2 (k1 int unique ,k2 char(10),k3 char(10))
INSERT INTO aupsert2 VALUES (3,'Utku','ERDEM');
INSERT INTO aupsert2 VALUES (4,'Ahmet','ASLAN');
INSERT INTO aupsert2 VALUES (5,'Mehmet','KIR');

Verilerimizi ekledikten ve  aupsert tablosuna aupsert2  tablosunda bulunan fark verilerini aktaralım.

İlk olarak tablomuzda ki verilerimizi görüntüleyelim.

aupsert2 tablosundaki verileri listeleyelim.

Aşağıdaki komut yardımı ile birinci tablomuzda ile ikinci tablomuz arasında farklı olanları verileri birinci tablomuza ekleyelim.

 

INSERT INTO aupsert(k1,k2,k3)
SELECT k1,k2,k3
FROM aupsert2
ON CONFLICT (k1)
DO
   UPDATE SET k2 = EXCLUDED.k2 , k3 = excluded.k3 ;

Yukarıda görüldüğü gibi 4 ve 5 kayıtları olmadığı için aupsert tablomuza eklendi 3. kayıtta ise k3 kolonunda “ER” olan kayıt “ERDEM” olarak güncellenmiştir. Yukarıdaki örnek ile insert ve update işlemi birlikte gerçekleşmiştir.

Loading