ฉันต้องการเสนอความคิดอื่นเพื่อระบุประโยคของคุณโดยเฉพาะ: "ดังนั้นฉันต้องการตรวจสอบว่าแถวเดียวจากชุดมีอยู่ในตารางเพราะแล้วฉันรู้ว่าพวกเขาทั้งหมดถูกแทรก "
คุณกำลังทำสิ่งต่าง ๆ ให้มีประสิทธิภาพโดยการใส่ใน "แบทช์" แต่จากนั้นทำการตรวจสอบการมีอยู่ของแต่ละระเบียนหรือไม่ ดูเหมือนว่ามันจะง่ายสำหรับฉัน ดังนั้นเมื่อคุณพูดว่า " ส่วนแทรกจะทำในแบตช์เสมอ " ฉันถือว่าคุณหมายถึงคุณกำลังแทรกหลายระเบียนด้วยคำสั่งแทรกเดียว คุณต้องตระหนักว่า Postgres นั้นเป็นไปตามข้อกำหนดของกรด หากคุณกำลังแทรกหลายระเบียน (ชุดข้อมูล) ที่มีคำสั่งแทรกเดียวไม่จำเป็นต้องตรวจสอบว่ามีการแทรกบางส่วนหรือไม่ คำสั่งผ่านหรือไม่ก็จะล้มเหลว บันทึกทั้งหมดจะถูกแทรกหรือไม่มี
ในทางกลับกันถ้ารหัส C # ของคุณกำลังทำคำสั่งแทรก "set" แยกต่างหากตัวอย่างเช่นในลูปและในใจของคุณนี่คือ "แบทช์" .. ดังนั้นคุณไม่ควรอธิบายว่าเป็น " เม็ดมีดจะถูกทำเป็นแบต " ความจริงที่ว่าคุณคาดหวังว่าส่วนหนึ่งของสิ่งที่คุณเรียกว่า "แบทช์" อาจไม่ได้แทรกและจริง ๆ แล้วรู้สึกว่าจำเป็นต้องมีการตรวจสอบอย่างยิ่งแสดงให้เห็นอย่างชัดเจนว่าเป็นกรณีนี้ในกรณีนี้ คุณต้องเปลี่ยนกระบวนทัศน์ของคุณเพื่อแทรกหลาย ๆ ระเบียนด้วยการแทรกครั้งเดียวและนำหน้าการตรวจสอบว่าแต่ละระเบียนสร้างขึ้นหรือไม่
ลองพิจารณาตัวอย่างนี้:
CREATE TABLE temp_test (
id SERIAL PRIMARY KEY,
sometext TEXT,
userid INT,
somethingtomakeitfail INT unique
)
-- insert a batch of 3 rows
;;
INSERT INTO temp_test (sometext, userid, somethingtomakeitfail) VALUES
('foo', 1, 1),
('bar', 2, 2),
('baz', 3, 3)
;;
-- inspect the data of what we inserted
SELECT * FROM temp_test
;;
-- this entire statement will fail .. no need to check which one made it
INSERT INTO temp_test (sometext, userid, somethingtomakeitfail) VALUES
('foo', 2, 4),
('bar', 2, 5),
('baz', 3, 3) -- <<--(deliberately simulate a failure)
;;
-- check it ... everything is the same from the last successful insert ..
-- no need to check which records from the 2nd insert may have made it in
SELECT * FROM temp_test
นี่คือกระบวนทัศน์จริงสำหรับฐานข้อมูลที่สอดคล้องกับกรดใด ๆ .. ไม่ใช่แค่ Postgresql ในคำอื่น ๆ คุณจะดีกว่าถ้าคุณแก้ไขแนวคิด "แบทช์" ของคุณและหลีกเลี่ยงการตรวจสอบแถวโดยแถวในสถานที่แรก