문제

CREATE에 삽입 트리거를 사용하기 전에 POSTGRESQL이 있습니다. 기본적으로 서브 테이블에 삽입을 리디렉션합니다. 레코드를 삽입하면 트리거에서 RETURN NULL을 사용하는 데 중복 된 데이터를 피하기 위해 중복 된 데이터를 피하기 위해 요청을 중단하고 싶습니다. 문제는 ID를 얻을 수 있도록 리턴 될 레코드가 필요하다는 것입니다. 내가 null을 돌려 주면, 나는 null을 얻는다.

위의 문제는 아래 링크에서 논의됩니다. PostgreSQL 트리거 아무것도 반환하지 않음

답변 중 하나는 상위 테이블에 삽입하는 것입니다 (null을 반환하지 않고 새로 반환하지 않음) 및 삽입 트리거 후에 상위 테이블에서 삭제 한 후에 사용할 수 있습니다. 그러나 나는 초당 1000 개의 쓰기를보고 있습니다. 이것은 삭제로 인해 성능에 심각한 문제 일 수 있습니다.이 작업을 수행하는 다른 방법은 무엇입니까?

정확하게 삽입 된 행의 ID를 상위 테이블에 삽입하고 나중에 삭제하지 않고 삽입 된 행의 ID를 반환하는 방법이 있습니다.

도움이 되었습니까?

해결책

i 를 언급하고있는 답변을 썼습니다. 내가 이미 저기에 암시했듯이,

이 목적을 위해 RULE ... INSTEAD ..를 사용할 수도 있습니다.

generacodicicetagcode

규칙 은 까다로울 수 있습니다. 차라리 가능한 경우 트리거를 사용합니다. 이렇게하기 전에 조금 읽으십시오 를 읽어야합니다.

CREATE OR REPLACE RULE tbl_ins AS
ON INSERT TO tbl
DO INSTEAD
INSERT INTO tbl2 (col1, col2, ...)  -- just do mention columns where ...
VALUES (NEW.col1, NEW.col2, ...)    -- ... you want to insert column defaults
RETURNING tbl2.*
. 팩토리 행을 피하면서 RULE에서 값을 반환하는

. , tbl2에 대한 설명서 당 :

CREATE RULE, INSERT 또는 뷰에서 UPDATE의 규칙에서 추가 할 수 있습니다. 뷰의 열을 방출하는 DELETE 절. 이 조항은 규칙이 트리거 된 경우 출력을 계산하는 데 사용됩니다. RETURNING, INSERT RETURNING 또는 UPDATE RETURNING 명령을 각각. DELETE RETURNING가없는 명령에 의해 규칙이 트리거되면 규칙의 RETURNING 절이 무시됩니다. 현재 구현을 허용합니다 RETURNING를 포함하는 무조건적인 INSTEAD 규칙 만;

대담한 강조 광산.

RETURNING를 언급 한 이후로 삽입물을 배포하는 조건이 필요합니다 ...

sub-tables / currval()

트리거 lastval()로 작동하는 경우 FOR EACH ROW / currval()로 시퀀스에서 적절한 값을 쉽게 가져올 수 있습니다. 까다로운 부분은 트리거 함수에서 해당 값을 반환하는 것입니다. 나는 임시 테이블에만 쓰는 것을 생각할 수 있습니다. 언제 만들어야하는지와 그 하나를 드롭 할 때 사고가 필요합니다 ...

아마도 전체 접근 방법 을 다시 생각하고 데이터를 여러 lastval() 문으로 데이터를 실제 대상 테이블에 리디렉션 ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top