Gostaria de propor outro pensamento para abordar especificamente sua frase: "Quero verificar se existe uma única linha do lote na tabela, porque sei que todas foram inseridas ".
Você está tornando as coisas eficientes, inserindo "lotes", mas depois verificando a existência, um registro de cada vez? Isso parece contra-intuitivo para mim. Então, quando você diz " inserções sempre são feitas em lotes ", entendo que você esteja inserindo vários registros com uma instrução de inserção . Você precisa perceber que o Postgres é compatível com ACID. Se você estiver inserindo vários registros (um lote de dados) com uma instrução de inserção , não será necessário verificar se alguns foram inseridos ou não. A declaração é aprovada ou falhará. Todos os registros serão inseridos ou nenhum.
Por outro lado, se o seu código C # estiver simplesmente fazendo um conjunto de instruções de inserção separadas, por exemplo, em um loop, e em sua mente, este é um "lote" .. então você não deve descrevê-lo como " inserções são sempre feitas em lotes ". O fato de que você espera que parte do que você chama de "lote" possa não ser realmente inserido e, portanto, sinta a necessidade de uma verificação, sugere fortemente que esse é o caso, caso em que você tem um problema mais fundamental. Você precisa alterar seu paradigma para realmente inserir vários registros com uma inserção e deixar de verificar se os registros individuais o fizeram.
Considere este exemplo:
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
Na verdade, esse é o paradigma de qualquer banco de dados compatível com ACID. Não apenas o Postgresql. Em outras palavras, você estará melhor se corrigir o conceito de "lote" e evitar a necessidade de fazer verificações linha por linha em primeiro lugar.