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.