Initially immediate vs initially deferred

本文详细介绍了Oracle SQL中不同类型的约束,包括initially immediate和initially deferred的使用方式及区别,并通过实例展示了如何设置和使用deferrable约束。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[size=large][color=blue]Initially immediate[/color][/size]

This is the default when neither initially immediate nor initially deferred has been specified.
The constraint is checked after each SQL statement.
create table init_immediate (
id number primary key initially immediate,
data varchar2(50)
);


[size=large][color=blue]Initially deferred[/color][/size]

The constraint is checked when a transaction ends.
drop table init_immediate;

create table init_immediate (
id number primary key initially deferred,
data varchar2(50) not null initially deferred
);


insert into init_immediate values ( null, 'one');
insert into init_immediate values ( 3, null);
insert into init_immediate values ( 8, 'eight');
insert into init_immediate values ( 3, 'two');

update init_immediate set id = 1 where data = 'one';
update init_immediate set id = 2 where data = 'two';
update init_immediate set data = 'three' where id = 3;

commit;

It will be OK.

[size=large][color=blue]ORA-02447[/color][/size]

A not deferrable constraint cannot be set to initially deferred,
it raises an [b]ORA-02447: cannot defer a constraint that is not deferrable[/b] which seems logical:
create table no_no_ora_02447 (
id number primary key not deferrable initially deferred,
data varchar2(50)
);


[size=large][color=blue]Deferrable constraint[/color][/size]
create table cons_deferrable_pk_tab (
a number,
b varchar2(10),
c number not null deferrable,
d date,
primary key (a, b) deferrable
);

create table cons_deferrable_fk_tab (
z,
y,
x varchar2(10),
foreign key (z,y) references cons_deferrable_pk_tab deferrable
);


Now we insert data to the table will fails, because reference table has not been inserted data yet.
insert into cons_deferrable_fk_tab values (1, 'one', 'foo');

[b]ORA-02291: 整合性制約(ZOLO.SYS_C005382)に違反しました - 親キーがありません[/b]

set constraints all deferred


And now the constraints are deferred, so we can insert data which still not inserted to the reference table.

insert into cons_deferrable_fk_tab values (1, 'one', 'foo');


Though commit will fail.

[size=large][color=blue]set constraints [Oracle SQL][/color][/size]
set constraint[s] all { immediate | deferred };
set constraint[s] constraint-name-1 [, constraint-name-n ...] { immediate | deferred };
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值