Oracle 有没有可能有一个;“延迟检查约束”;在甲骨文?

Oracle 有没有可能有一个;“延迟检查约束”;在甲骨文?,oracle,constraints,check-constraint,Oracle,Constraints,Check Constraint,我想我希望在Postgres中有一个“延迟检查约束”,但显然是这样(Postgres 9.3) 然后,我看到Oracle似乎广泛地“推迟”了它的约束,有文档记录。因此,Oracle 10g+是否真的支持“延迟检查约束” 我可能错过了与此相反的更多文档,因此我想在这里再次询问,作为一种检查,相信有人积极使用Oracle,他们会知道答案,从而避免了反复试验和错误,避免浪费时间与Oracle服务器混在一起。是的,您可以将约束定义为 "DEFERRABLE" or "NOT DEFERRABLE" 然

我想我希望在Postgres中有一个“延迟检查约束”,但显然是这样(Postgres 9.3)

然后,我看到Oracle似乎广泛地“推迟”了它的约束,有文档记录。因此,Oracle 10g+是否真的支持“延迟检查约束”


我可能错过了与此相反的更多文档,因此我想在这里再次询问,作为一种检查,相信有人积极使用Oracle,他们会知道答案,从而避免了反复试验和错误,避免浪费时间与Oracle服务器混在一起。

是的,您可以将约束定义为

"DEFERRABLE" or "NOT DEFERRABLE"
然后

"INITIALLY DEFERRED" or "INITIALLY IMMEDIATE"
例如:

ALTER TABLE T
ADD CONSTRAINT ck_t CHECK (COL_1 > 0)
DEFERRABLE INITIALLY DEFERRED;

查看Oracle文档了解详细信息…

是的,您可以将约束定义为

"DEFERRABLE" or "NOT DEFERRABLE"
然后

"INITIALLY DEFERRED" or "INITIALLY IMMEDIATE"
例如:

ALTER TABLE T
ADD CONSTRAINT ck_t CHECK (COL_1 > 0)
DEFERRABLE INITIALLY DEFERRED;

查看Oracle文档了解详细信息…

是的,您可以将约束定义为

"DEFERRABLE" or "NOT DEFERRABLE"
然后

"INITIALLY DEFERRED" or "INITIALLY IMMEDIATE"
例如:

ALTER TABLE T
ADD CONSTRAINT ck_t CHECK (COL_1 > 0)
DEFERRABLE INITIALLY DEFERRED;

查看Oracle文档了解详细信息…

是的,您可以将约束定义为

"DEFERRABLE" or "NOT DEFERRABLE"
然后

"INITIALLY DEFERRED" or "INITIALLY IMMEDIATE"
例如:

ALTER TABLE T
ADD CONSTRAINT ck_t CHECK (COL_1 > 0)
DEFERRABLE INITIALLY DEFERRED;

查看Oracle文档了解详细信息…

是的,但我不确定您为什么要:

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.
。。。但我不确定如果您计划更新它,为什么首先要将无效值放在表中。大概在某些情况下,这是有用的


更多关于约束延迟的信息。

是的,但我不确定您为什么要:

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.
。。。但我不确定如果您计划更新它,为什么首先要将无效值放在表中。大概在某些情况下,这是有用的


更多关于约束延迟的信息。

是的,但我不确定您为什么要:

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.
。。。但我不确定如果您计划更新它,为什么首先要将无效值放在表中。大概在某些情况下,这是有用的


更多关于约束延迟的信息。

是的,但我不确定您为什么要:

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.
。。。但我不确定如果您计划更新它,为什么首先要将无效值放在表中。大概在某些情况下,这是有用的


更多关于约束延迟的信息。

当两个表需要相互FK时,我使用延迟约束。这是一个非常严格的fk约束。我已经用过几次了……几乎从来没有用过。@BrianMcGinity-我感到困惑的是延迟检查约束的使用,而不是一般的延迟。我想我只见过FKs被推迟。哦…那太奇怪了…除了你所概述的,我想不出其他原因了。如果您在insert时不知道某个值,请执行某些操作以查找该值,然后在提交之前更新该表。。。嗯……想不出另外一个原因……有时候,一个人继承了非常糟糕的模式,于是产生了一种“控制它们”的欲望。。。例如,“多态关联”和类似的东西。。。当两个表需要相互FK时,我使用延迟约束。这是一个非常严格的fk约束。我已经用过几次了……几乎从来没有用过。@BrianMcGinity-我感到困惑的是延迟检查约束的使用,而不是一般的延迟。我想我只见过FKs被推迟。哦…那太奇怪了…除了你所概述的,我想不出其他原因了。如果您在insert时不知道某个值,请执行某些操作以查找该值,然后在提交之前更新该表。。。嗯……想不出另外一个原因……有时候,一个人继承了非常糟糕的模式,于是产生了一种“控制它们”的欲望。。。例如,“多态关联”和类似的东西。。。当两个表需要相互FK时,我使用延迟约束。这是一个非常严格的fk约束。我已经用过几次了……几乎从来没有用过。@BrianMcGinity-我感到困惑的是延迟检查约束的使用,而不是一般的延迟。我想我只见过FKs被推迟。哦…那太奇怪了…除了你所概述的,我想不出其他原因了。如果您在insert时不知道某个值,请执行某些操作以查找该值,然后在提交之前更新该表。。。嗯……想不出另外一个原因……有时候,一个人继承了非常糟糕的模式,于是产生了一种“控制它们”的欲望。。。例如,“多态关联”和类似的东西。。。当两个表需要相互FK时,我使用延迟约束。这是一个非常严格的fk约束。我已经用过几次了……几乎从来没有用过。@BrianMcGinity-我感到困惑的是延迟检查约束的使用,而不是一般的延迟。我想我只见过FKs被推迟。哦…那太奇怪了…除了你所概述的,我想不出其他原因了。如果您在insert时不知道某个值,请执行某些操作以查找该值,然后在提交之前更新该表。。。嗯……想不出另外一个原因……有时候,一个人继承了非常糟糕的模式,于是产生了一种“控制它们”的欲望。。。例如,“多态关联”和类似的东西。。。