UPSERT: ON CONFLICT DO UPDATE (PostgreSQL)
สร้างการเพิ่มข้อมูลที่ทำซ้ำได้อย่างปลอดภัยด้วย ON CONFLICT DO UPDATE ใช้ EXCLUDED และเลือกเป้าหมายของความขัดแย้งที่เหมาะสม
UPSERT: ON CONFLICT DO UPDATE (PostgreSQL) เป็นบทเรียน SQL Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน SQL Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
UPSERT คืออะไร
UPSERT = INSERT หากยังไม่มีข้อมูล และ UPDATE หากมีข้อมูลอยู่แล้ว PostgreSQL เรียกสิ่งนี้ว่า INSERT ... ON CONFLICT
ON CONFLICT DO NOTHING
เพิ่มข้อมูลหากยังไม่มี และข้ามอย่างเงียบ ๆ หากเป็นข้อมูลซ้ำ:
INSERT INTO users (email, full_name)
VALUES ('alice@example.com', 'Alice')
ON CONFLICT (email) DO NOTHING;ON CONFLICT DO UPDATE
เพิ่มข้อมูลหากยังไม่มี มิฉะนั้นให้อัปเดตคอลัมน์ที่ระบุ:
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: แถวที่เสนอ
ภายใน DO UPDATE EXCLUDED.col หมายถึง “ค่าที่ INSERT พยายามเพิ่มเข้าไป” ส่วนชื่อคอลัมน์เปล่า ๆ (หรือ users.col) หมายถึงแถวที่มีอยู่เดิม
ON CONFLICT (email)
DO UPDATE SET visits = users.visits + 1,
last_seen = EXCLUDED.last_seen;เป้าหมายข้อขัดแย้ง
คุณต้องระบุข้อจำกัด unique หรือคีย์หลัก:
ON CONFLICT (email) -- column with UNIQUE
ON CONFLICT (user_id, day) -- composite UNIQUE
ON CONFLICT ON CONSTRAINT users_email_key -- by nameUPSERT แบบมีเงื่อนไข (WHERE ใน DO UPDATE)
อัปเดตเฉพาะเมื่อเงื่อนไขเป็นจริง:
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 หลายแถว
เพิ่มข้อมูลหลายแถว โดยจัดการแต่ละแถวแยกจากกัน:
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 ร่วมกับ UPSERT
รับแถวผลลัพธ์กลับมา ไม่ว่าจะเป็นแถวที่เพิ่มใหม่หรือแถวที่อัปเดต:
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;กระบวนการทำงานแบบทำซ้ำได้อย่างปลอดภัย
UPSERT ทำให้การลองใหม่ปลอดภัย หากเว็บฮุกของคุณทำงานสองครั้ง การเรียกครั้งที่สองจะอัปเดตแถวเดิมแทนการสร้างข้อมูลซ้ำ
MERGE (มาตรฐาน SQL, PG15 ขึ้นไป)
PostgreSQL 15 เพิ่ม MERGE ตามมาตรฐาน SQL ซึ่งสามารถ INSERT/UPDATE/DELETE ได้ในคำสั่งเดียว:
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);กรณีที่ไม่ควรใช้ UPSERT
UPSERT ต้องมีข้อจำกัด unique หากไม่มี โดยทั่วไปคุณควรใช้ SELECT แยกต่างหาก แล้วจึง INSERT หรือ UPDATE แต่ต้องระวังสภาวะการแข่งขัน และครอบการทำงานไว้ในธุรกรรมพร้อมการล็อกที่เหมาะสม
สรุป
ON CONFLICT คือ UPSERT แบบสะอาดและเป็นอะตอมิกของ PostgreSQL
- DO NOTHING สำหรับ “เพิ่มข้อมูลหากยังไม่มี”
- DO UPDATE สำหรับการทำ upsert อย่างแท้จริง
EXCLUDED= แถวที่เสนอ- ระบุเป้าหมายข้อขัดแย้งเสมอ
ตรวจสอบความเข้าใจอย่างรวดเร็ว
ใน ON CONFLICT (email) DO UPDATE SET last_login = EXCLUDED.last_login EXCLUDED หมายถึงอะไร
คำถามที่พบบ่อย
บทเรียน “UPSERT: ON CONFLICT DO UPDATE (PostgreSQL)” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “UPSERT: ON CONFLICT DO UPDATE (PostgreSQL)” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส SQL Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส SQL Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “UPSERT: ON CONFLICT DO UPDATE (PostgreSQL)”
สร้างการเพิ่มข้อมูลที่ทำซ้ำได้อย่างปลอดภัยด้วย ON CONFLICT DO UPDATE ใช้ EXCLUDED และเลือกเป้าหมายของความขัดแย้งที่เหมาะสม คุณปฏิบัติ SQL Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน SQL Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน SQL Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “UPSERT: ON CONFLICT DO UPDATE (PostgreSQL)” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน SQL Academy นี้ได้ไหม
ได้ บทเรียน SQL Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- INSERT หลายแถว
- UPSERT: ON CONFLICT DO UPDATE (PostgreSQL)
- UPDATE ด้วย FROM และการอัปเดตแบบ JOIN
- DELETE ด้วย USING และรูปแบบที่ปลอดภัย