我在想,我想有一個Postgres的「遞延檢查約束」,但這顯然是not supported at this time(Postgres的9.3)在Oracle中是否可以有「延期檢查約束」?
然後我看到甲骨文似乎已經廣泛「延期」的約束,記錄在here。因此,Oracle 10g +是否支持「延遲檢查約束」?
我可能錯過了相反的進一步文檔,所以我想在這裏問一個複選框,相信有人會主動使用Oracle,他們會知道答案 - 從而避免反覆試驗,浪費幾個小時與Oracle服務器有關。
我在想,我想有一個Postgres的「遞延檢查約束」,但這顯然是not supported at this time(Postgres的9.3)在Oracle中是否可以有「延期檢查約束」?
然後我看到甲骨文似乎已經廣泛「延期」的約束,記錄在here。因此,Oracle 10g +是否支持「延遲檢查約束」?
我可能錯過了相反的進一步文檔,所以我想在這裏問一個複選框,相信有人會主動使用Oracle,他們會知道答案 - 從而避免反覆試驗,浪費幾個小時與Oracle服務器有關。
是,儘管我「M不知道你爲什麼會想:
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。
是的,你可以定義約束爲
"DEFERRABLE" or "NOT DEFERRABLE"
然後
"INITIALLY DEFERRED" or "INITIALLY IMMEDIATE"
例如:
ALTER TABLE T
ADD CONSTRAINT ck_t CHECK (COL_1 > 0)
DEFERRABLE INITIALLY DEFERRED;
詳情請查看Oracle文檔...
當兩個表需要FK到另一個時,我使用延遲約束。這是一個非常嚴格的fk約束。我用過幾次...幾乎沒有。 –
@BrianMcGinity - 這是使用延遲*檢查*約束,我感到困惑,而不是一般推遲。我想我只見過FK被推遲。 –
哦......這很奇怪......我想不出你所概述的另一個原因。如果你在插入時不知道一個值,那麼做一些事情來找到值,然後在提交之前更新表......嗯......不能想到另一個原因...... –