oracle可延迟约束

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

 

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

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

 

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

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

 

语法如下:

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

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

 

参考例子:

CREATE TABLE salesman
(
salesman_id_n NUMBER NOT NULL,
salesman_code_s VARCHAR2(2) NOT NULL,
salesman_name_s VARCHAR2(50) NOT NULL,
salesman_status_s CHAR(1) DEFAULT 'Y',
CONSTRAINT chk_salesstatus CHECK (salesman_status_s in ('N', 'Y'))
DEFERRABLE INITIALLY DEFERRED,
CONSTRAINT pk_salesmanprim PRIMARY KEY (salesman_id_n)
);

CREATE TABLE address
(
addr_id_n NUMBER CONSTRAINT pk_addrprimary PRIMARY KEY,
addr_custid_fn NUMBER,
addr_salesmanid_fn NUMBER CONSTRAINT fk_addr_salesman
REFERENCES salesman (salesman_id_n)
ON DELETE CASCADE,
addr_address_s VARCHAR2(60),
addr_type_s VARCHAR2(8) CONSTRAINT chk_addr_type CHECK
(addr_type_s IN ('BILLING', 'SHIPPING')),
addr_city_s VARCHAR2(18) CONSTRAINT nn_addr_city NOT NULL,
addr_state_s CHAR(2),
addr_zip_s VARCHAR2(10) NOT NULL,
addr_country_s CHAR(3)
);

INSERT INTO salesman
(
salesman_id_n,
salesman_code_s,
salesman_name_s,
salesman_status_s
)
VALUES
(23,'02','FAIRFIELD BUGS ASSOCIATION','A');

UPDATE salesman
SET salesman_status_s = 'Y'
WHERE salesman_status_s = 'A';

COMMIT;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值