내가 특별히 당신의 문장을 해결하기 위해 다른 생각을 제안하고 싶습니다 : "나는 때문에 배치에서 하나의 행이 테이블에 존재하는지 확인하려는 그래서 나는 그들이 모두 알고 다음 되었다 삽입 ."
당신은 "배치"에 삽입하여 일을 효율적으로 만들고 있지만 존재 확인을 한 번에 한 레코드 씩 수행합니까? 이것은 나에게 직관적이지 않습니다. 당신이 말할 때 그래서 " 삽입은 항상 일괄 적으로 수행하는 " 당신은 당신이 하나의 INSERT 문으로 여러 레코드를 삽입하는 의미 나는 그것을 가지고 . Postgres가 ACID를 준수한다는 것을 알아야합니다. 하나의 insert 문으로 여러 레코드 (일괄 데이터) 를 삽입하는 경우 일부 레코드가 삽입 되었는지 여부를 확인할 필요가 없습니다. 명령문이 통과되거나 실패합니다. 모든 레코드가 삽입되거나 없습니다.
반면에 C # 코드가 루프와 같이 단순히 "set"별도의 insert 문을 수행하는 경우 이는 "batch"입니다. 실제로 "#" 인서트는 항상 배치로 수행됩니다. " "일괄 처리"라고 부르는 부분이 실제로 삽입되지 않을 수 있으므로 실제로 검사 할 필요가 있다고 생각하면 이것이 더 근본적인 문제가있는 것입니다. 실제로 하나의 삽입으로 여러 레코드를 삽입하고 개별 레코드가 작성했는지 확인하지 않으려면 패러다임을 변경해야합니다.
이 예제를 고려하십시오.
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
이것은 실제로 Postgresql뿐만 아니라 모든 ACID 호환 DB에 대한 패러다임입니다. 다시 말해, "일괄 처리"개념을 수정하고 우선 행 단위 검사를 수행하지 않는 것이 좋습니다.