constraint parameter test

1.prepare the data materials

SQL> create table cust (cust_id number(2),cust_name varchar2(15));

SQL> desc cust;
Name                                                                                    Null?                         Type
—————————————————– ——– ——————————————–
CUST_ID                                                                                                           NUMBER(2)
CUST_NAME                                                                                                 VARCHAR2(15)

add a constraint

SQL> alter table cust add constraint cust_id_pk primary key (cust_id)  deferrable   initially   deferred;

deferrable :我理解为在事务中可以改变上一条参数的设置

deferred:我理解为”延迟生效”。

如果不指定参数,默认设置是 initially immediate not deferrable。
注意:如果约束是not deferrable,那么它只能是initially immediate,而不能是initially deferred。

继续测试,插入数据

SQL> insert into cust values (1,’RAJ’);

1 row created.

SQL> insert into cust values (1,’SAM’);

1 row created.

SQL> commit;
commit
*
ERROR at line 1:
ORA-02091: transaction rolled back
ORA-00001: unique constraint (SCOTT.CUST_ID_PK) violated

在尝试commit的时候,由于primary key的constraint,报错了。这个应该是deferred的效果,也就是在整个事务结束的时候才验证constraint,是否合规。

继续测试,还是在这个session中,更改constraint的参数设置,”immediate”这个关键字,也能猜出个一二三了,应该是在语句结束时就验证,而且其生效区间应该结束于commit。

SQL> set constraint cust_id_pk immediate;

Constraint set.

查看当前cust表中有哪些内容,有两条记录。

SQL> select * from cust;

CUST_ID CUST_NAME
———- —————
1                 LATA
2                 king

尝试insert一条记录

SQL> insert into cust values (1,’new haha’);
insert into cust values (1,’new haha’)
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.CUST_ID_PK) violated

立刻参数立刻生效报错了,然后结束这个事务,commit.

SQL> commit;

Commit complete.

SQL> insert into cust values (1,’new haha’);

1 row created.

//你又可以塞进去东西了,但是在你commit的时候,估计还是会报错,因为constraint的参数是deferrable   initially   deferred:延迟生效,在每个commit结束后生效。

SQL> commit;
commit
*
ERROR at line 1:
ORA-02091: transaction rolled back
ORA-00001: unique constraint (SCOTT.CUST_ID_PK) violated

//果然

–EOF–