Я хотів би запропонувати ще одну думку, щоб конкретно вирішити ваше речення: "Тому я хочу перевірити, чи існує один рядок із партії в таблиці, тому що я знаю, що вони всі були вставлені ".
Ви робите все ефективніше, вставляючи в "партії", а потім роблячи існування перевіряє по одному запису? Мені це здається протилежним інтуїтивно зрозумілим. Отже, коли ви говорите " вставки завжди робляться партіями ", я вважаю, що ви маєте на увазі, що ви вставляєте кілька записів з одним оператором вставки . Вам потрібно усвідомити, що Postgres сумісний з кислотними кислотами. Якщо ви вставляєте кілька записів (пакет даних) за допомогою одного оператора вставки , не потрібно перевіряти, чи були вони вставлені чи ні. Заява або проходить, або буде невдалою. Усі записи будуть вставлені або відсутні.
З іншого боку, якщо ваш код C # просто робить "встановити" окремі заяви-вставки, наприклад, у циклі, і на вашу думку, це "пакет". Тоді ви насправді не повинні описувати це як " вставки завжди робляться партіями ". Той факт, що ви очікуєте, що частина того, що ви називаєте "партією", насправді не може бути вставлена, і, отже, відчуваєте необхідність перевірки, настійно говорить про те, що це так, і в цьому випадку у вас є більш фундаментальна проблема. Вам потрібно змінити парадигму, щоб фактично вставити кілька записів за допомогою одного вкладиша, і відмовитися від перевірки, чи це зробили окремі записи.
Розглянемо цей приклад:
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
Це насправді парадигма для будь-якого БД, сумісного з ACID, а не лише Postgresql. Іншими словами, вам краще, якщо ви зафіксуєте свою "пакетну" концепцію і уникнете необхідності робити перевірку рядків за рядками.