UPSERT: ON CONFLICT DO UPDATE (PostgreSQL)
Laksanakan sisipan idempoten dengan ON CONFLICT DO UPDATE, gunakan EXCLUDED dan pilih sasaran konflik yang tepat.
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 nameUPSERT 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?
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
- INSERT dengan Pelbagai Baris
- UPSERT: ON CONFLICT DO UPDATE (PostgreSQL)
- UPDATE dengan FROM dan Kemas Kini Gaya JOIN
- DELETE dengan USING dan Corak Selamat