Saya ingin mengusulkan pikiran lain untuk secara khusus menangani kalimat Anda: "Jadi saya ingin memeriksa apakah satu baris dari batch yang ada di meja karena kemudian saya tahu mereka semua yang dimasukkan ."
Anda membuat hal-hal efisien dengan memasukkan "batch" tetapi kemudian melakukan pemeriksaan keberadaan satu catatan pada suatu waktu? Ini tampaknya kontra intuitif bagi saya. Jadi, ketika Anda mengatakan " sisipan selalu dilakukan dalam batch " saya menganggap Anda berarti Anda memasukkan banyak catatan dengan satu pernyataan insert . Anda perlu menyadari bahwa Postgres sesuai dengan ACID. Jika Anda menyisipkan beberapa catatan (kumpulan data) dengan satu pernyataan masukkan , tidak perlu memeriksa apakah ada yang dimasukkan atau tidak. Pernyataan itu lulus atau akan gagal. Semua catatan akan dimasukkan atau tidak ada.
Di sisi lain, jika kode C # Anda hanya melakukan "set" pernyataan insert yang terpisah, misalnya, dalam satu lingkaran, dan dalam pikiran Anda, ini adalah "batch" .. maka Anda seharusnya tidak menggambarkannya sebagai " sisipan selalu dilakukan dalam batch ". Fakta bahwa Anda mengharapkan bagian dari apa yang Anda sebut "batch", mungkin sebenarnya tidak dimasukkan, dan karenanya merasakan perlunya pemeriksaan, sangat menunjukkan hal ini, dalam hal ini Anda memiliki masalah yang lebih mendasar. Anda perlu mengubah paradigma Anda untuk benar-benar menyisipkan banyak catatan dengan satu sisipan, dan lupakan memeriksa apakah catatan individual membuatnya.
Pertimbangkan contoh ini:
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
Ini sebenarnya adalah paradigma untuk setiap ACID compliant DB .. bukan hanya Postgresql. Dengan kata lain Anda lebih baik jika Anda memperbaiki konsep "batch" Anda dan menghindari harus melakukan pemeriksaan baris demi baris di tempat pertama.