이 질문의 몇 년이 지났지 만 스페인 사람들을 위해 분명히하고 싶습니다. 테스트는 Postgres에서 수행되었습니다.
키트가 기본 키인 1337 레코드 테이블에 다음 제한 조건이 추가되었습니다.
**Bloque 1**
ALTER TABLE ele_kitscompletos
ADD CONSTRAINT unique_div_nkit
PRIMARY KEY (div_nkit)
그러면 테이블에 대해 기본 기본 키 NOT DEFERRED가 생성되므로 다음 UPDATE를 시도하면 오류가 발생합니다.
update ele_kitscompletos
set div_nkit = div_nkit + 1;
오류 : 중복 키가 고유성 제한을 위반 함«unique_div_nkit»
Postgres에서 각 ROW에 대해 UPDATE를 실행하면 RESTRICTION 또는 CONSTRAINT가 충족되는지 확인합니다.
CONSTRAINT IMMEDIATE가 작성되고 각 명령문이 개별적으로 실행됩니다.
ALTER TABLE ele_kitscompletos
ADD CONSTRAINT unique_div_nkit
PRIMARY KEY (div_nkit)
DEFERRABLE INITIALLY IMMEDIATE
**Bloque 2**
BEGIN;
UPDATE ele_kitscompletos set div_nkit = div_nkit + 1;
INSERT INTO public.ele_kitscompletos(div_nkit, otro_campo)
VALUES
(1338, '888150502');
COMMIT;
쿼리 OK, 영향을받는 0 개의 행 (실행 시간 : 0ms; 총 시간 : 0ms) 쿼리 OK, 영향을받는 1328 개의 행 (실행 시간 : 858ms; 총 시간 : 858ms) 오류 : llave duplicada viola restricción de unicidad«unique_div_nkit»DETAIL : La la lave (div_nkit) = (1338).
여기서 SI는 1 차 키 전체를 실행하므로 기본 키를 변경할 수 있습니다 (1328 행). 그러나 트랜잭션 (BEGIN)에 있지만 CONSTRAINT는 COMMIT를 작성하지 않고 각 문장을 완료하자마자 유효성이 검증되므로 INSERT를 실행할 때 오류가 발생합니다. 마지막으로 CONSTRAINT DEFERRED를 작성하여 다음을 수행하십시오.
**Bloque 3**
ALTER TABLE public.ele_edivipol
DROP CONSTRAINT unique_div_nkit RESTRICT;
ALTER TABLE ele_edivipol
ADD CONSTRAINT unique_div_nkit
PRIMARY KEY (div_nkit)
DEFERRABLE INITIALLY DEFERRED
** Block 2 **의 각 문장을 개별적으로 실행하면 각 문장을 개별적으로 실행하면 INSERT는 유효성을 검사하지 않기 때문에 오류가 발생하지 않지만 불일치를 발견하면 최종 COMMIT가 실행됩니다.
영어로 된 자세한 정보는 다음 링크를 확인하십시오.
깊이의 지연 가능한 SQL 제약
정의 할 수 없음과 초기에 즉시 정의 할 수 없음