Tôi muốn đề xuất một ý nghĩ khác để giải quyết cụ thể câu của bạn: "Vì vậy, tôi muốn kiểm tra xem một hàng duy nhất trong lô có tồn tại trong bảng không vì sau đó tôi biết tất cả chúng đều được chèn vào ."
Bạn đang làm cho mọi thứ hiệu quả bằng cách chèn vào "lô" nhưng sau đó thực hiện kiểm tra sự tồn tại một bản ghi tại một thời điểm? Điều này dường như phản trực giác với tôi. Vì vậy, khi bạn nói "việc chèn luôn được thực hiện theo đợt " thì tôi hiểu là bạn đang chèn nhiều bản ghi với một câu lệnh chèn . Bạn cần nhận ra rằng Postgres tuân thủ ACID. Nếu bạn đang chèn nhiều bản ghi (một lô dữ liệu) bằng một câu lệnh chèn , không cần kiểm tra xem một số có được chèn hay không. Tuyên bố hoặc thông qua hoặc nó sẽ thất bại. Tất cả các hồ sơ sẽ được chèn hoặc không có.
Mặt khác, nếu mã C # của bạn chỉ đơn giản là thực hiện một câu lệnh chèn riêng biệt "set", ví dụ, trong một vòng lặp và trong tâm trí của bạn, thì đây là một "đợt" .. thì thực tế bạn không nên mô tả nó là " chèn luôn được thực hiện theo lô ". Thực tế là bạn mong đợi rằng một phần của cái mà bạn gọi là "lô", thực sự có thể không được chèn vào, và do đó cảm thấy cần phải kiểm tra, đề nghị mạnh mẽ đây là trường hợp, trong trường hợp đó bạn có vấn đề cơ bản hơn. Bạn cần thay đổi mô hình của mình để thực sự chèn nhiều bản ghi với một lần chèn và kiểm tra trước nếu các bản ghi riêng lẻ thực hiện.
Xem xét ví dụ này:
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
Trên thực tế, đây là mô hình cho bất kỳ DB tuân thủ ACID nào .. không chỉ Postgresql. Nói cách khác, bạn sẽ tốt hơn nếu bạn sửa khái niệm "lô" của mình và tránh phải thực hiện bất kỳ kiểm tra hàng nào ở vị trí đầu tiên.