1

我正在尝试从查询日志中查找偶尔出现的错误:

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

4

1 回答 1

-1

来自(文档)[http://docs.oracle.com/cd/B19306_01/server.102/b14200/clauses002.htm]

DEFERRABLE 子句 DEFERRABLE 和 NOT DEFERRABLE 参数指示在后续事务中,是否可以使用 SET CONSTRAINT(S) 语句将约束检查推迟到事务结束。如果省略此子句,则默认为 NOT DEFERRABLE。

您有一个唯一的密钥违规。

因为约束是可延迟的,所以只有在您执行时才进行验证SET CONSTRAINT foo.bar DEFERRED

于 2013-05-20T17:32:50.697 回答