0Pricing
SQL Academy · Pelajaran

UPSERT: ON CONFLICT DO UPDATE (PostgreSQL)

Terapkan penyisipan idempoten dengan ON CONFLICT DO UPDATE, gunakan EXCLUDED, dan pilih target konflik yang tepat.

UPSERT: ON CONFLICT DO UPDATE (PostgreSQL) adalah pelajaran SQL Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar SQL Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus SQL Academy mencakup 4 pelajaran total.

Apa Itu UPSERT?

UPSERT = INSERT jika belum ada, UPDATE jika sudah ada. PostgreSQL menuliskannya sebagai INSERT ... ON CONFLICT.

ON CONFLICT DO NOTHING

Sisipkan jika belum ada, lewati secara diam-diam jika duplikat:

INSERT INTO users (email, full_name)
VALUES ('alice@example.com', 'Alice')
ON CONFLICT (email) DO NOTHING;

ON CONFLICT DO UPDATE

Sisipkan jika belum ada; jika tidak, perbarui kolom tertentu:

INSERT INTO users (email, full_name, last_login)
VALUES ('alice@example.com', 'Alice', NOW())
ON CONFLICT (email)
DO UPDATE SET
  full_name  = EXCLUDED.full_name,
  last_login = EXCLUDED.last_login;

EXCLUDED: Baris yang Diusulkan

Di dalam DO UPDATE, EXCLUDED.col berarti "nilai yang coba disisipkan oleh INSERT". Nama kolom tanpa awalan (atau users.col) berarti baris yang sudah ada.

ON CONFLICT (email)
DO UPDATE SET visits = users.visits + 1,
              last_seen = EXCLUDED.last_seen;

Target Konflik

Anda harus menyebutkan kendala UNIQUE atau kunci PRIMARY KEY:

ON CONFLICT (email)             -- column with UNIQUE
ON CONFLICT (user_id, day)      -- composite UNIQUE
ON CONFLICT ON CONSTRAINT users_email_key   -- by name

UPSERT Bersyarat (WHERE dalam DO UPDATE)

Perbarui hanya jika suatu kondisi terpenuhi:

INSERT INTO inventory (product_id, qty)
VALUES (42, 5)
ON CONFLICT (product_id)
DO UPDATE SET qty = inventory.qty + EXCLUDED.qty
WHERE inventory.qty + EXCLUDED.qty <= 1000;

UPSERT Banyak Baris

Sisipkan banyak baris; setiap baris ditangani secara terpisah:

INSERT INTO page_views (path, day, count)
VALUES ('/home', CURRENT_DATE, 1), ('/about', CURRENT_DATE, 1)
ON CONFLICT (path, day)
DO UPDATE SET count = page_views.count + EXCLUDED.count;

RETURNING dengan UPSERT

Dapatkan kembali baris hasilnya, baik yang disisipkan maupun yang diperbarui:

INSERT INTO users (email, full_name)
VALUES ('alice@example.com', 'Alice')
ON CONFLICT (email) DO UPDATE
  SET full_name = EXCLUDED.full_name
RETURNING id, full_name;

Alur Kerja Idempoten

UPSERT membuat percobaan ulang menjadi aman. Jika webhook Anda terpicu dua kali, pemanggilan kedua akan memperbarui baris yang sama, bukan membuat duplikat.

MERGE (Standar SQL, PG15+)

PostgreSQL 15 menambahkan MERGE yang sesuai standar SQL, yang dapat melakukan INSERT/UPDATE/DELETE dalam satu pernyataan:

MERGE INTO users AS u
USING (VALUES ('alice@example.com','Alice')) AS src(email, name)
ON u.email = src.email
WHEN MATCHED THEN UPDATE SET full_name = src.name
WHEN NOT MATCHED THEN INSERT (email, full_name) VALUES (src.email, src.name);

Kapan NOT Digunakan untuk UPSERT

UPSERT memerlukan kendala UNIQUE. Jika Anda tidak memilikinya, biasanya Anda memerlukan SELECT terpisah lalu INSERT atau UPDATE — tetapi waspadalah terhadap kondisi balapan; bungkus operasi dalam transaksi dengan penguncian yang sesuai.

Ringkasan

ON CONFLICT adalah UPSERT PostgreSQL yang bersih dan atomik.

  • DO NOTHING untuk "menyisipkan jika tidak ada"
  • DO UPDATE untuk upsert yang sebenarnya
  • EXCLUDED = baris yang diusulkan
  • Selalu sebutkan target konflik

Pemeriksaan Singkat

Dalam ON CONFLICT (email) DO UPDATE SET last_login = EXCLUDED.last_login, apa yang dimaksud dengan EXCLUDED?

Pertanyaan yang Sering Diajukan

Apakah pelajaran “UPSERT: ON CONFLICT DO UPDATE (PostgreSQL)” gratis?

Ya — teks lengkap “UPSERT: ON CONFLICT DO UPDATE (PostgreSQL)” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus SQL Academy, upgrade ke CoddyKit PRO. Kursus SQL Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “UPSERT: ON CONFLICT DO UPDATE (PostgreSQL)”?

Terapkan penyisipan idempoten dengan ON CONFLICT DO UPDATE, gunakan EXCLUDED, dan pilih target konflik yang tepat. Kamu berlatih SQL Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai SQL Academy?

Tidak diperlukan pengalaman sebelumnya. SQL Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.

Berapa lama pelajaran “UPSERT: ON CONFLICT DO UPDATE (PostgreSQL)” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran SQL Academy ini?

Ya. Setiap pelajaran SQL Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. INSERT dengan Banyak Baris
  2. UPSERT: ON CONFLICT DO UPDATE (PostgreSQL)
  3. UPDATE dengan FROM dan Pembaruan Bergaya JOIN
  4. DELETE dengan USING dan Pola Aman
← Kembali ke SQL Academy