SQL Academy · Pelajaran

UPSERT: ON CONFLICT DO UPDATE (PostgreSQL)

Laksanakan sisipan idempoten dengan ON CONFLICT DO UPDATE, gunakan EXCLUDED dan pilih sasaran konflik yang tepat.

Pelajaran 2 daripada 413 langkah

UPSERT: ON CONFLICT DO UPDATE (PostgreSQL) ialah pelajaran SQL Academy percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran SQL Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus SQL Academy merangkumi sejumlah 4 pelajaran.

Apakah UPSERT?

UPSERT = INSERT jika belum wujud, UPDATE jika sudah wujud. PostgreSQL menulisnya sebagai INSERT ... ON CONFLICT.

ON CONFLICT DO NOTHING

Sisipkan jika tiada, dan langkau secara senyap jika pendua:

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

ON CONFLICT DO UPDATE

Sisipkan jika tiada; jika tidak, kemas kini lajur 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 Dicadangkan

Dalam DO UPDATE, EXCLUDED.col bermaksud "nilai yang cuba disisipkan oleh INSERT". Nama lajur tanpa awalan (atau users.col) bermaksud baris sedia ada.

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

Sasaran Konflik

Anda mesti menamakan kekangan keunikan atau kunci primer:

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)

Kemas kini hanya apabila syarat dipenuhi:

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 Berbilang Baris

Sisipkan banyak baris; setiap baris dikendalikan secara berasingan:

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 semula baris yang terhasil, sama ada disisipkan atau dikemas kini:

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;

Aliran Kerja Idempoten

UPSERT menjadikan percubaan semula selamat. Jika cangkuk web anda dicetuskan dua kali, panggilan kedua mengemas kini baris yang sama dan bukannya mencipta pendua.

MERGE (Piawaian SQL, PG15+)

PostgreSQL 15 menambahkan MERGE yang mematuhi piawaian SQL, dan boleh 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);

Bila TIDAK Menggunakan UPSERT

UPSERT memerlukan kekangan keunikan. Jika anda tidak mempunyainya, biasanya anda memerlukan SELECT yang berasingan diikuti INSERT atau UPDATE — tetapi berhati-hati terhadap keadaan perlumbaan; bungkus operasi itu dalam transaksi dengan penguncian yang sesuai.

Ringkasan

ON CONFLICT ialah UPSERT PostgreSQL yang bersih dan atomik.

  • DO NOTHING untuk "sisipkan jika tiada"
  • DO UPDATE untuk upsert sebenar
  • EXCLUDED = baris yang dicadangkan
  • Sentiasa namakan sasaran konflik

Semakan Pantas

Dalam ON CONFLICT (email) DO UPDATE SET last_login = EXCLUDED.last_login, apakah yang dirujuk oleh EXCLUDED?

Percuma untuk bermula

Pelajari SQL dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
46
Pelajaran
183

Soalan Lazim

Adakah pelajaran “UPSERT: ON CONFLICT DO UPDATE (PostgreSQL)” percuma?

Ya — teks penuh “UPSERT: ON CONFLICT DO UPDATE (PostgreSQL)” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus SQL Academy, tingkat taraf kepada CoddyKit PRO. Kursus SQL Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “UPSERT: ON CONFLICT DO UPDATE (PostgreSQL)”?

Laksanakan sisipan idempoten dengan ON CONFLICT DO UPDATE, gunakan EXCLUDED dan pilih sasaran konflik yang tepat. Anda berlatih SQL Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan SQL Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran SQL Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.

Berapa lamakah pelajaran “UPSERT: ON CONFLICT DO UPDATE (PostgreSQL)” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran SQL Academy ini?

Ya. Setiap pelajaran SQL Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. INSERT dengan Pelbagai Baris
  2. UPSERT: ON CONFLICT DO UPDATE (PostgreSQL)
  3. UPDATE dengan FROM dan Kemas Kini Gaya JOIN
  4. DELETE dengan USING dan Corak Selamat
← Kembali ke SQL Academy