삽입 ... 리턴 ... 트리거 cancels 문을 트리거 할 때 비워 둡니다.
-
21-12-2019 - |
문제
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()
문으로 데이터를 실제 대상 테이블에 리디렉션 ...