Ich möchte einen anderen Gedanken vorzuschlagen speziell Ihren Satz anzusprechen: „Also ich , wenn eine einzelne Zeile aus der Charge überprüfen möchten in der Tabelle existiert , weil dann ich weiß , sie alle wurden eingefügt .“
Sie machen die Dinge effizient, indem Sie sie in "Stapel" einfügen, aber dann die Existenzprüfungen jeweils für einen Datensatz durchführen? Dies scheint mir nicht intuitiv zu sein. Also , wenn Sie sagen , „ Einsätze werden immer in Chargen getan “ Ich nehme an , Sie meinen Sie mehrere Datensätze mit einem Insert - Anweisung einfügen . Sie müssen erkennen, dass Postgres ACID-konform ist. Wenn Sie mehrere Datensätze (einen Datenstapel) mit einer Einfügeanweisung einfügen , müssen Sie nicht überprüfen, ob einige eingefügt wurden oder nicht. Die Anweisung besteht entweder oder sie schlägt fehl. Alle Datensätze werden eingefügt oder keine.
Auf der anderen Seite, wenn Ihr C # -Code einfach separate Einfügeanweisungen "setzt", zum Beispiel in einer Schleife, und in Ihrem Kopf ist dies ein "Stapel". Dann sollten Sie ihn tatsächlich nicht als "beschreiben". Einsätze erfolgen immer chargenweise ". Die Tatsache, dass Sie erwarten, dass ein Teil dessen, was Sie als "Stapel" bezeichnen, möglicherweise nicht eingefügt wird und daher eine Überprüfung erforderlich ist, legt den Schluss nahe, dass dies der Fall ist. In diesem Fall haben Sie ein grundlegenderes Problem. Sie müssen Ihr Paradigma ändern, um tatsächlich mehrere Datensätze mit einer Einfügung einzufügen, und auf die Überprüfung verzichten, ob die einzelnen Datensätze es geschafft haben.
Betrachten Sie dieses Beispiel:
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
Dies ist in der Tat das Paradigma für jede ACID-kompatible Datenbank. Nicht nur für Postgresql. Mit anderen Worten, Sie sind besser dran, wenn Sie Ihr "Batch" -Konzept korrigieren und zunächst keine zeilenweisen Überprüfungen durchführen müssen.