我試圖追查從查詢日誌中偶爾的錯誤:Oracle錯誤推遲當約束
SQLSTATE[HY000]: General error: 1 OCIStmtExecute: ORA-00001: unique constraint (FOO.BAR) violated
這似乎發生當應用程序試圖執行一個事務中以下查詢:
SET CONSTRAINT foo.bar DEFERRED
有問題的約束條件是使用下面的DDL創建:
ALTER TABLE baz
ADD CONSTRAINT bar
UNIQUE (quux, duux)
DEFERRABLE
INITIALLY IMMEDIATE
USING INDEX
TABLESPACE tuux
本質上說,運行此查詢代碼執行以下操作:
- 開始事務
- 推遲約束
- 進行必要的更新
- Undefer約束
- 提交更新
我的問題是:上面的SET CONSTRAINT
查詢如何可能導致唯一的約束違反?我確信這是有問題的查詢,因爲我有異常的堆棧跟蹤。
我同意,你不應該看到一個唯一的違反約束,直到你不受約束。請注意,'set constraint x deferred'不是查詢。我懷疑約束是否真正可延遲,或者'set constraint x deferred'語句中指定的約束是否正確。 –
設置約束x延遲只有在更新完成後纔會導致違規(因爲它是DDL,強制執行)。如果你只是想調試數據嘗試使用日誌錯誤http://www.oracle-base.com/articles/10g/dml-error-logging-10gr2.php – asafm