เนื่องจากโมเดล MVCCของ Postgres และตามกฎของ SQL การUPDATE
เขียนเวอร์ชันแถวใหม่สำหรับทุกแถวที่ไม่รวมอยู่ในส่วนWHERE
คำสั่ง
นี้ไม่ได้มีผลกระทบอย่างมีนัยสำคัญมากขึ้นหรือน้อยลงในการปฏิบัติงานโดยตรงและโดยอ้อม "การอัปเดตที่ว่างเปล่า" มีค่าใช้จ่ายต่อแถวเหมือนกับการอัปเดตอื่น ๆ พวกเขาเรียกใช้ทริกเกอร์ (หากมี) เช่นอัพเดตอื่น ๆ พวกเขาจะต้องเข้าสู่ระบบ WALและพวกเขาผลิตแถวที่ตายแล้วจะพองตัวในตารางและทำให้ทำงานได้มากขึ้นในVACUUM
ภายหลังเช่นอัพเดตอื่น ๆ
รายการดัชนีและคอลัมน์TOASTที่ไม่มีคอลัมน์ใด ๆ ที่เกี่ยวข้องสามารถเปลี่ยนแปลงได้เหมือนเดิม แต่จะเป็นจริงสำหรับแถวที่อัพเดต ที่เกี่ยวข้อง:
เป็นความคิดที่ดีที่จะยกเว้นการอัปเดตที่ว่างเปล่าดังกล่าวอยู่เสมอ (เมื่อมีโอกาสจริงที่อาจเกิดขึ้น) คุณไม่ได้ให้คำจำกัดความของตารางในคำถามของคุณ (ซึ่งเป็นความคิดที่ดีเสมอ) เราต้องสมมติว่าfirst_name
สามารถเป็น NULL ได้ (ซึ่งไม่น่าแปลกใจสำหรับ "ชื่อ") ดังนั้นการสืบค้นจึงต้องใช้การเปรียบเทียบแบบ NULL-safe :
UPDATE users
SET first_name = 'Michael'
WHERE id = 123
AND first_name IS DISTINCT FROM 'Michael';
ถ้าfirst_name IS NULL
ก่อนการอัพเดทการทดสอบที่เพิ่งfirst_name <> 'Michael'
จะประเมินค่าเป็น NULL และเช่นนั้นไม่รวมแถวจากการอัพเดต ข้อผิดพลาดส่อเสียด หากมีการกำหนดNOT NULL
คอลัมน์ให้ใช้การตรวจสอบความเท่าเทียมกันอย่างง่าย ๆ เนื่องจากมีราคาถูกกว่าเล็กน้อย
ที่เกี่ยวข้อง: