ตัวอย่างเช่นเมื่อฉันใช้การสืบค้นซึ่งจะส่งกลับรหัสบันทึก
INSERT INTO projects(name)
VALUES (name1), (name2), (name3) returning id;
ซึ่งผลิตผลผลิต:
1
2
3
รหัสนี้จะชี้ไปที่ค่าแทรกที่สอดคล้องกันหรือไม่
1 -> name1
2 -> name2
3 -> name3
ตัวอย่างเช่นเมื่อฉันใช้การสืบค้นซึ่งจะส่งกลับรหัสบันทึก
INSERT INTO projects(name)
VALUES (name1), (name2), (name3) returning id;
ซึ่งผลิตผลผลิต:
1
2
3
รหัสนี้จะชี้ไปที่ค่าแทรกที่สอดคล้องกันหรือไม่
1 -> name1
2 -> name2
3 -> name3
คำตอบ:
คำตอบสำหรับกรณีแบบนี้คือใช่ แถวจะถูกแทรกตามลำดับที่ระบุในVALUES
นิพจน์ และหากid
คอลัมน์ของคุณเป็นserial
ประเภทค่าจากลำดับพื้นฐานจะถูกเรียกในลำดับนั้น
แต่นี่คือรายละเอียดการนำไปปฏิบัติและไม่มีการรับประกัน โดยเฉพาะอย่างยิ่งการสั่งซื้อไม่จำเป็นต้องเก็บรักษาไว้ในแบบสอบถามที่ซับซ้อนมากขึ้นที่มีWHERE
เงื่อนไขหรือเข้าร่วม
คุณอาจได้รับช่องว่างหรือแถวอื่น ๆ ผสมถ้าคุณมีการทำธุรกรรมพร้อมกันเขียนลงในตารางเดียวกันในเวลาเดียวกัน ไม่น่าเป็นไปได้ แต่เป็นไปได้
ไม่มีคำสั่ง "ธรรมชาติ" ในตารางฐานข้อมูล ในขณะที่ลำดับทางกายภาพของแถว (ซึ่งแสดงในคอลัมน์ระบบctid
) จะสอดคล้องกับลำดับที่แทรกไว้ในขั้นต้นซึ่งอาจเปลี่ยนแปลงได้ตลอดเวลา UPDATE
, DELETE
, VACUUM
และคำสั่งอื่น ๆ สามารถเปลี่ยนการสั่งซื้อทางกายภาพของแถว แต่ค่าที่สร้างขึ้นสำหรับid
มีความเสถียรและไม่ได้เชื่อมต่อกับสิ่งนั้นแน่นอน
serial
คอลัมน์ที่สร้างขึ้นใหม่- นึกคิดในการทำธุรกรรมเดียวกัน
WHERE
เงื่อนไข แม้ว่าฉันจะไม่สามารถนึกถึงWHERE
เงื่อนไขธรรมดา ๆที่จะเปลี่ยนลำดับของแถวได้ แต่การเข้าร่วมสามารถทำได้อย่างแน่นอน
คำตอบของ Erwin Brandstetterอาจไม่ถูกต้องในบางกรณี
เราได้ทำไปแล้วINSERT INTO ... SELECT bar,baz FROM foo ORDER BY bar
และเราเห็นว่าการ
SELECT ctid,* FROM foo
เรียงลำดับทางกายภาพของแถวในตารางไม่ตรงกับคำสั่งแทรกแน่นอนดูเหมือนว่าจะมีสัญญาณรบกวนขึ้นเล็กน้อย โปรดทราบว่าตารางของเรามีคอลัมน์ jsonb ที่มีขนาดข้อมูลที่หลากหลาย การตัดทอนข้อมูล jsonb แบบทดลองระหว่างการแทรกทำให้ลำดับการแทรกถูกต้อง