我正在尝试从查询日志中追踪偶然的错误:
SQLSTATE [HY000]:常规错误:1 OCIStmtExecute:ORA-00001:违反了唯一约束(FOO.BAR)
当应用程序尝试在事务中执行以下查询时,似乎会发生这种情况:
SET CONSTRAINT foo.bar DEFERRED
使用以下DDL创建了有问题的约束:
ALTER TABLE baz
ADD CONSTRAINT bar
UNIQUE (quux, duux)
DEFERRABLE
INITIALLY IMMEDIATE
USING INDEX
TABLESPACE tuux
基本上,运行此查询的代码执行以下操作:
我的问题是:上面的SET CONSTRAINT
查询怎么可能导致唯一的约束违规?我确信这是有问题的查询,因为我有异常的堆栈跟踪。
答案 0 :(得分:-1)
来自(docs)[http://docs.oracle.com/cd/B19306_01/server.102/b14200/clauses002.htm]
DEFERRABLE子句DEFERRABLE和NOT DEFERRABLE参数 指示在后续交易中是否约束 检查可以推迟到交易结束时使用 SET CONSTRAINT(S)声明。如果省略此子句,则默认 是不可取的。
您有一个唯一的密钥违规。
因为约束是可延迟的,所以只有在执行SET CONSTRAINT foo.bar DEFERRED
时才会进行验证。