2011-01-14 7 views
6

Oracle에서는 지연된 제약 조건이 커밋 시점에서만 검사됩니다.열이 null 연기 할 수 없음

NOT NULL 제약 조건의 경우 DEFERRABLE 절의 의미는 무엇입니까?

create table test(a number not null deferrable, b number); 
insert into test(a,b) values (222, 111); 
commit; 

예를 들어 은 이러한 진술 후 다음 코드는

update test set a = null where b = 111; 
delete test where b = 111; 
commit; 

일을 것이라고 생각하지만 그렇지 않습니다.

두 정의의 차이점은 무엇입니까?

create table test1(a number not null deferrable, b number); 
create table test2(a number not null, b number); 

답변

10

여기에는 두 가지 옵션이 있습니다. 어느 쪽이든 당신은 사용자가 정의한 UPDATE 문을 수행하기 전에 실행해야합니다

SET CONSTRAINTS ALL DEFERRED; 

이 아래의 명령을 사용하여 제약 조건은 트랜잭션 내에서 연기 할 설정해야합니다.

또는 당신이 일 중 하나를 수행 한 후

create table test(a number not null initially deferred deferrable, b number); 

테이블 정의에 INITIALLY DEFERRED로 제약 조건을 설정할 수 있습니다, 당신은 다음 질문에 가지고있는 DML을 실행 할 수 있어야한다.

+1

네, 맞습니다. INITIALLY DEFERRED를 사용하면 코드가 작동합니다. 감사. –

관련 문제