PostgreSQL UPSERT Kullanımı

Yusuf Kahveci
SQL Türkiye
Published in
2 min readJun 11, 2019

Bu yazımızda, PostgreSQL de UPSERT kullanımına değineceğiz

İlişkisel veritabanlarında, üst düzey terimi birleştirme olarak adlandırılır. Fikir şuydu, tabloya yeni bir satır eklediğinizde, PostgreSQL zaten mevcutsa satırı günceller, aksi takdirde PostgreSQL yeni satırı ekler. Bu nedenle harekete geçme diyoruz (güncelleme veya ekleme).

SQL Server da ki Merge kavramı ile aynıdır aslında. SQL Server da ki Merge kavramını okumak için buraya tıklamanız yeterli.

Şimdi ise Syntax ‘ına bakalım.

INSERT INTO table_name(column_list) VALUES(value_list)
ON CONFLICT target action;

PostgreSQL’deki upsert özelliğini kullanmak için INSERT ON CONFLICT deyimini yukarıda ki gibi kullanmalısınız.

DO NOTHING deyimi satır zaten tabloda mevcutsa hiçbir şey yapmamanız anlamına gelir.

DO UPDATE SET column_1 = value_1, .. WHERE condition burada ise tabloda belirtilen alanları güncelleyin demektir.

Demo ile daha net anlayabilirsiniz. Şimdi ise bir kaç demo tablo oluşturalım.

CREATE TABLE demo01 (
customer_id serial PRIMARY KEY,
name VARCHAR,
email VARCHAR NOT NULL,
active bool NOT NULL DEFAULT TRUE
);

İkinci demo tablomuzu oluşturalım.

CREATE TABLE demo02 (
customer_id serial PRIMARY KEY,
name VARCHAR,
email VARCHAR NOT NULL,
active bool NOT NULL DEFAULT TRUE
);

Şimdi ise bu tablolara data basalım.

INSERT INTO demo01 (NAME, email)
VALUES
('SQL Türkiye', 'yusufkahveci@sqlturkiye.com'),
(
'PostgreSQL',
'contact@postgresql.com'
),
(
'Deneme',
'contact@deneme.com'
);

Aynı data setini değiştirerek ikinci demo tablomuza basalım.

INSERT INTO demo02 (NAME, email)
VALUES
('SQL Türkiye', 'info@sqlturkiye.com'),
(
'PostgreSQL_Turkiye',
'contact@postgresql.com'
),
(
'Deneme_999',
'contact@deneme.com'
),
(
'Demo',
'contact@demo.com'
);

İkinci tablomuza gördüğünüz üzere hem var olan datalarda değişiklik yaptık hem de ek olarak bir satır daha data ekledik.

Şimdi her iki tablomuza da SELECT çekerek datalarımızı kontrol edelim.

İki tablo arasında UPSERT işlemini aşağıda hazırlamış olduğum query ile gerçekleştirebilirsiniz. burada excluded ettiğim kolonlar da güncellemeler var ise güncelleyecek ve demo02 olupta demo01 de olmayan kayıtları da insert edecek.

INSERT INTO demo01 ( customer_id, name, email, active)
SELECT customer_id, name, email, active
FROM demo02
ON CONFLICT (customer_id)
DO UPDATE SET email = excluded.email,name=excluded.name;

Bu işlemden sonra tablomuzu kontrol ettiğimizde ,

Upsert işlemimiz başarılı olmuş. Şimdi ise tablomuza SELECT çekerek kontrol edelim.

NOT : İki tablo arasında değilde tek tabloda da UPSERT işlemi gerçekleştirilebilir.

Kolay Gelsin.

--

--