Я хотел бы предложить еще одну мысль, чтобы конкретно рассмотреть ваше предложение: «Итак, я хочу проверить, существует ли в таблице одна строка из пакета, потому что тогда я знаю, что все они были вставлены ».
Вы делаете вещи эффективными, вставляя «партии», но затем проводите проверки существования по одной записи за раз? Это кажется мне нелогичным. Поэтому, когда вы говорите « вставки всегда выполняются партиями », я понимаю, что вы имеете в виду, что вы вставляете несколько записей одним оператором вставки . Вы должны понимать, что Postgres совместим с ACID. Если вы вставляете несколько записей (пакет данных) с одним оператором вставки , нет необходимости проверять, были ли некоторые вставлены или нет. Утверждение либо проходит, либо провалится. Все записи будут вставлены или нет.
С другой стороны, если ваш код на 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. Другими словами, вам лучше, если вы исправите свою «пакетную» концепцию и избежите необходимости выполнять какие-либо построчные проверки в первую очередь.