我正在尝试在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应该不同,它应该永远不会遇到“唯一约束违规”错误。
答案 0 :(得分:3)
主键是PROJECT_ID
,BUG_NO
,SNAPSHOT_DATESTAMP
和SNAPSHOT_TYPE
的组合。这意味着您允许(并且可能具有!)具有相同项目ID,错误号和快照类型的多个行,但是来自不同的日期。您的update
语句将尝试将给定项目的所有快照日期,错误号和状态设置为同一日期(当前日期),从而打破唯一性并因违反约束而失败。