oracle非延迟约束,oracle 延迟性约束

--创建一个样例表

HR@prod> create table dept2 as select * from departments;

--查看dept2的表拥有哪些约束

HR@prod> select uc.constraint_name,uc.constraint_type,ucc.column_name

2  from user_constraints uc,user_cons_columns ucc

3  where uc.constraint_name=ucc.constraint_name

4  and uc.table_name='DEPT2';

CONSTRAINT_NAME         C COLUMN_NAME

------------------------------ - --------------------

SYS_C0011291         C DEPARTMENT_NAME

--给dept2表增加一个延迟性的主键约束

HR@prod> alter table dept2

2  add constraint dept2_pk

3  primary key(department_id)

4  deferrable initially deferred;

Table altered.

--延迟性约束,校验约束规则的时机

HR@prod> insert into dept2 values(280,'MARKET',null,1700);

1 row created.

HR@prod> insert into dept2 values(280,'SALES',null,1800);

1 row created.

HR@prod> commit;

commit

*

ERROR at line 1:

ORA-02091: transaction rolled back

ORA-00001: unique constraint (HR.DEPT2_PK) violated

--延迟性约束的延迟状态变为immediate

HR@prod> set constraint dept2_pk immediate;

HR@prod> insert into dept2 values(280,'MARKET',null,1700);

1 row created.

HR@prod> insert into dept2 values(280,'SALES',null,1800);

insert into dept2 values(280,'SALES',null,1800)

*

ERROR at line 1:

ORA-00001: unique constraint (HR.DEPT2_PK) violated

HR@prod> commit;

--immediate状态,会导致出错语句做语句级回滚,不会影响正常的数据插入;

*************************

--如果想让当前会话,所有的延迟性约束都在当前会话中改变状态:

HR@prod> select constraint_name,deferrable,deferred from user_constraints where constraint_name='DEPT2_PK'

HR@prod> /

CONSTRAINT_NAME         DEFERRABLE     DEFERRED

------------------------------ -------------- ---------

DEPT2_PK         DEFERRABLE     DEFERRED

HR@prod> alter session set constraints=immediate;

HR@prod> insert into dept2 values(290,'SALES',NULL,1700);

1 row created.

HR@prod> insert into dept2 values(290,'haha',null,1700);

insert into dept2 values(290,'haha',null,1700)

*

ERROR at line 1:

ORA-00001: unique constraint (HR.DEPT2_PK) violated

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值