mysql 延迟约束_Oracle可延迟约束Deferable的使用

欢迎进入Oracle社区论坛,与200万技术人员互动交流 >>进入 标准规定,约束可以是deferrable或not deferrable(默认)。 not deferrable 约束在每一个DML语句后检查; deferrable 约束可以在每一个insert,delete,或update(即时模式)后立即检查,或者在事

欢迎进入Oracle社区论坛,与200万技术人员互动交流 >>进入

标准规定,约束可以是deferrable或not deferrable(默认)。

not deferrable 约束在每一个DML语句后检查;

deferrable 约束可以在每一个insert,delete,或update(即时模式)后立即检查,或者在事务末尾检查(延迟模式)

当没有按特定顺序执行数据加载时,这项功能特别有用――它允许先把数据载入子表,然后再装入父表。

另一种用法是在加载不符合某个check约束的数据之后,对其进行适当的更新。

语法如下:

[ [not] deferrable [initially {immediate | deferred} ] ]

[ [initially {immediate | deferred} ] [not] deferrable ]

1 deferrable介绍

1.1 deferrable的两个选项区别

deferrable表示该约束是可延迟验证的。 它有两个选项:

Initially immediate(默认): 立即验证, 执行完一个sql后就进行验证;

Initially deferred: 延迟验证, 当事务提交时或调用set constraint[s] immediate语句时才验证。

区别是: 事务提交时验证不通过, 则立即回滚事务; set constraint[s] immediate时只验证, 不回滚事务。

1.2 not deferrable与deferrable区别

区别就在于: “立即验证的可延迟约束” 是可以根据需要设置成 “延迟验证的可延迟约束”的, 而“不可延迟验证”是不能改变的。

2 deferrable实例

2.1 建表

create table test1(a number(1) constraint check_a check(a > 0) deferrable

initially immediate,

b number(1) constraint check_b check(b > 0) deferrable

initially deferred);

2.2 正常插入,没问题

SQL> insert into test1 values(1, 1);

1 row inserted

2.3 检验立即验证:数据不能插入

SQL> insert into test1 values(-1, 1);

insert into test1 values(-1, 1)

ORA-02290: 违反检查约束条件 (MYHR.CHECK_A)

2.4 检验延迟验证:可以执行

SQL> insert into test1 values(1, -1);

1 row inserted

SQL> select * from test1;

A B

-- --

1 1

1 -1

2.5 提交延迟验证(commit):验证失败,自动回滚

SQL> commit;

commit

ORA-02091: 事务处理已回退

ORA-02290: 违反检查约束条件 (MYHR.CHECK_B)

2.6 提交延迟验证(set constraint immediate):验证失败,不回滚

SQL> insert into test1 values(1, -1);

1 row inserted

SQL> set constraint check_b immediate;

set constraint check_b immediate

ORA-02290: 违反检查约束条件 (MYHR.CHECK_B)

或者将所有的约束做修改: alter session set constraints = immediate;

或者:set constraints all immediate;

2.7 将延迟验证设置为立即验证:则在插入时出错

SQL> set constraint check_b immediate;

Constraints set

SQL> insert into test1 values(1,-1);

insert into test1 values(1,-1)

ORA-02290: 违反检查约束条件 (MYHR.CHECK_B)

[1] [2]

test.jsp?url=http%3A%2F%2Fwww.chinaitlab.com%2Fcms%2Fimages%2Flogo14.gif&refer=http%3A%2F%2Foracle.chinaitlab.com%2Fexploiture%2F890225.html

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:php中文网

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值