0Pricing
SQL Academy · บทเรียน

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 name

UPSERT แบบมีเงื่อนไข (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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. INSERT หลายแถว
  2. UPSERT: ON CONFLICT DO UPDATE (PostgreSQL)
  3. UPDATE ด้วย FROM และการอัปเดตแบบ JOIN
  4. DELETE ด้วย USING และรูปแบบที่ปลอดภัย
← กลับไปที่ SQL Academy