Vorrei proporre un altro pensiero per indirizzare in modo specifico la tua frase: "Quindi voglio verificare se esiste una sola riga dal batch nella tabella perché poi so che sono stati inseriti tutti ".
Stai rendendo le cose efficienti inserendo "batch" ma facendo controlli di esistenza un record alla volta? Questo mi sembra poco intuitivo. Quindi quando dici "gli inserimenti vengono sempre eseguiti in batch " , intendo che intendi inserire più record con un'istruzione insert . È necessario rendersi conto che Postgres è conforme ACID. Se si inseriscono più record (un batch di dati) con un'istruzione insert , non è necessario verificare se alcuni sono stati inseriti o meno. L'istruzione passa o fallisce. Tutti i record verranno inseriti o nessuno.
D'altra parte, se il tuo codice C # sta semplicemente facendo un "set" istruzioni di inserimento separate, ad esempio in un ciclo, e nella tua mente, questo è un "batch" .. allora non dovresti in effetti descriverlo come " gli inserti vengono sempre eseguiti in batch ". Il fatto che ti aspetti che parte di ciò che chiami un "batch", in realtà potrebbe non essere inserito e quindi sentire la necessità di un controllo, suggerisce fortemente che è così, nel qual caso hai un problema più fondamentale. È necessario modificare il paradigma per inserire effettivamente più record con un solo inserimento e rinunciare a verificare se i singoli record lo hanno creato.
Considera questo esempio:
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
Questo è in effetti il paradigma per qualsiasi DB conforme ACID .. non solo Postgresql. In altre parole, è meglio se risolvi il concetto di "batch" ed evita di dover fare controlli riga per riga in primo luogo.