1

我正在尝试在 ORACLE 中运行以下相当简单的更新语句。

UPDATE PROJECT_BUG_SNAPSHOTS
SET   SNAPSHOT_DATESTAMP = sysdate, 
      SNAPSHOT_TYPE      = P_SNAPSHOT_TYPE
      WHERE  PROJECT_ID  = P_PROJECT_ID
      AND    BUG_NO      = P_BUG_NO
      AND    BUG_STATUS  = P_BUG_STATUS;

它抱怨违反唯一约束。

PK 包括PROJECT_ID,BUG_NO,SNAPSHOT_DATESTAMP,SNAPSHOT_TYPE.

表结构为

PROJECT_ID          NUMBER
SNAPSHOT_DATESTAMP  DATE
SNAPSHOT_TYPE       VARCHAR2(20 BYTE)
BUG_NO              NUMBER
BUG_STATUS          VARCHAR2(100 BYTE)

这很奇怪,因为每次运行时 sysdate 都应该不同,并且它永远不会遇到“违反唯一约束”错误。

4

1 回答 1

3

主键是PROJECT_IDBUG_NOSNAPSHOT_DATESTAMP和的组合SNAPSHOT_TYPE。这意味着您允许(并且可能有!)多行具有相同的项目 ID、错误编号和快照类型,但日期不同。您的update声明将尝试将给定项目的所有快照日期、错误编号和状态设置为同一日期(当前日期),从而破坏唯一性并由于违反约束而失败。

于 2015-01-14T07:17:08.113 回答