这个跟你添加约束的时候有关,约束有三个选项:DEFERRABLE INITIALLY DEFERREDDEFERRABLE INITIALLY IMMEDIATENOT DEFERRABLE默认的话是第三种,而第三中是immediate的,并不受set constraint影响例如:以一般方式添加的约束SQL> create table t1(a int);Table created.SQL> alter table t1 add constraint pk unique(a);Table altered.SQL> select deferrable from dba_constraints where owner='GOWIN' and constraint_name='PK';DEFERRABLE--------------NOT DEFERRABLESQL> create or replace procedure tes 2 as 3 begin 4 insert into t1 values (1); 5 insert into t1 values (1); 6 end; 7 /Procedure created.SQL> set constraints all deferred;constraint set.SQL> exec tesBEGIN tes; END;*ERROR at line 1:ORA-00001: unique constraint (GOWIN.PK) violatedORA-06512: at "GOWIN.TES", line 5ORA-06512: at line 1然后以另两种方式中的一种添加约束的方式SQL> drop table t1;Table dropped.SQL> create table t1(a int);Table created.SQL> alter table t1 add constraint pk unique(a) DEFERRABLE initially deferred;Table altered.SQL> select deferrable from dba_constraints where owner='GOWIN' and constraint_name='PK';DEFERRABLE--------------DEFERRABLESQL> create or replace procedure tes 2 as 3 begin 4 insert into t1 values (1); 5 insert into t1 values (1); 6 end; 7 /Procedure created.SQL> exec tesPL/SQL procedure successfully completed.SQL> select * from t1; A---------- 1 1SQL> commit;commit*ERROR at line 1:ORA-02091: transaction rolled backORA-00001: unique constraint (GOWIN.PK) violated
