我想我想在Postgres中有一个“延迟检查约束”,但这显然是not supported at this time(Postgres 9.3)
然后我看到甲骨文似乎广泛地“推迟”其约束,记录here。因此,Oracle 10g +是否支持具有“延迟检查约束”?
我可能错过了相反的进一步文档,所以我想在这里要求进行仔细检查,相信有人积极使用Oracle会知道答案 - 从而避免了反复试验,浪费了几个小时搞乱Oracle服务器。
答案 0 :(得分:2)
是的,虽然我不确定你为什么要这样做:
create table t42 (id number,
constraint check_id check (id > 0) initially deferred deferrable);
table T42 created.
insert into t42 (id) values (-1);
1 rows inserted.
commit;
Error report -
SQL Error: ORA-02091: transaction rolled back
ORA-02290: check constraint (STACKOVERFLOW.CHECK_ID) violated
02091. 00000 - "transaction rolled back"
*Cause: Also see error 2092. If the transaction is aborted at a remote
site then you will only see 2091; if aborted at host then you will
see 2092 and 2091.
*Action: Add rollback segment and retry the transaction.
您可以在提交之前更新它:
insert into t42 (id) values (-1);
1 rows inserted.
update t42 set id = 1 where id = -1;
1 rows updated.
commit;
committed.
...但是我不确定如果您计划更新它,为什么要在表格中首先放置无效值。据推测,有一些情况下这很有用。
有关约束延迟的更多信息in the documentation。
答案 1 :(得分:1)
是的,您可以将约束定义为
"DEFERRABLE" or "NOT DEFERRABLE"
然后
"INITIALLY DEFERRED" or "INITIALLY IMMEDIATE"
例如:
ALTER TABLE T
ADD CONSTRAINT ck_t CHECK (COL_1 > 0)
DEFERRABLE INITIALLY DEFERRED;
查看Oracle文档以获取详细信息......