推迟约束时出现Oracle错误

时间:2013-05-20 14:06:22

标签: sql oracle constraints ddl unique-constraint

我正在尝试从查询日志中追踪偶然的错误:

  

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查询怎么可能导致唯一的约束违规?我确信这是有问题的查询,因为我有异常的堆栈跟踪。

1 个答案:

答案 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时才会进行验证。