Oracle中是否可以有“延迟检查约束”?

问题描述 投票:0回答:2

我想我希望在 Postgres 中有一个“延迟检查约束”,但这显然目前不支持(Postgres 9.3)

插入或修改行时(而不是在语句末尾)始终立即检查

NOT NULL
CHECK
约束。

然后我发现 Oracle 似乎普遍“推迟”了其限制,记录在here。因此,Oracle 10g+ 真的支持“延迟检查约束”吗?

我可能错过了更多相反的文档,所以我想在这里询问作为双重检查,相信积极使用 Oracle 的人会知道答案 - 从而避免反复试验,浪费时间搞乱与 Oracle 服务器。

oracle constraints check-constraints
2个回答
3
投票

是的,虽然我不确定你为什么想要:

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.

...但我不确定如果您计划更新它,为什么您首先要将无效值放入表中。想必在某些情况下这很有用。

有关约束延迟的更多信息在文档中


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 文档了解详细信息...

© www.soinside.com 2019 - 2024. All rights reserved.