Oracle 有没有可能有一个;“延迟检查约束”;在甲骨文?
我想我希望在Postgres中有一个“延迟检查约束”,但显然是这样(Postgres 9.3) 然后,我看到Oracle似乎广泛地“推迟”了它的约束,有文档记录。因此,Oracle 10g+是否真的支持“延迟检查约束”Oracle 有没有可能有一个;“延迟检查约束”;在甲骨文?,oracle,constraints,check-constraint,Oracle,Constraints,Check Constraint,我想我希望在Postgres中有一个“延迟检查约束”,但显然是这样(Postgres 9.3) 然后,我看到Oracle似乎广泛地“推迟”了它的约束,有文档记录。因此,Oracle 10g+是否真的支持“延迟检查约束” 我可能错过了与此相反的更多文档,因此我想在这里再次询问,作为一种检查,相信有人积极使用Oracle,他们会知道答案,从而避免了反复试验和错误,避免浪费时间与Oracle服务器混在一起。是的,您可以将约束定义为 "DEFERRABLE" or "NOT DEFERRABLE" 然
我可能错过了与此相反的更多文档,因此我想在这里再次询问,作为一种检查,相信有人积极使用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时不知道某个值,请执行某些操作以查找该值,然后在提交之前更新该表。。。嗯……想不出另外一个原因……有时候,一个人继承了非常糟糕的模式,于是产生了一种“控制它们”的欲望。。。例如,“多态关联”和类似的东西。。。