[ORACLE] ORA-00001: Unique constraint (string.string) violated

[ORACLE] ORA-00001: Unique constraint (string.string) violated

錯誤概述

違反唯一約束條件

 

錯誤訊息

Oracle Error: ORA-00001

Error Description:
Unique constraint (string.string) violated

Error Cause:
An UPDATE or INSERT statement attempted to insert a duplicate key. For Trusted Oracle configured in DBMS MAC mode, you may see this message if a duplicate entry exists at a different level.

Action:
Either remove the unique restriction or do not insert the key.

 

 

情境說明

出現此錯誤,表示寫入(INSERT) / 更新(UPDATE) 到有唯一值約束的欄位有重複值,有得時候找了老半天,明明就已經沒重複了,為何還出錯?可能的原因之一,應該是遺漏了「重複」的其他可能性。

 

此錯誤的發生,可分四種情況:

(1) 寫入目的資料表 ( TABLE_UNIQUE ) 已存在的值

034

 

(2) 寫入的來源資料 ( TABLE_SOURCE ) 本身有重複

033

 

(3) 上述情況的綜合體:寫入目的資料表已存在的值 + 寫入的來源資料本身有重複

035

 

(4) 更新的值,已存在唯一約束欄位中

036

 

 

案例


CREATE TABLE TABLE_UNIQUE (
  AID NUMBER CONSTRAINT PK_TABLE_UNIQUE PRIMARY KEY
);

--建立資料來源表
CREATE TABLE TABLE_SOURCE (
  AID NUMBER,
  BID NUMBER
);

--寫入資料
INSERT INTO TABLE_UNIQUE (AID) VALUES (1);
INSERT INTO TABLE_UNIQUE (AID) VALUES (3);
INSERT INTO TABLE_SOURCE (AID, BID) VALUES (2, 1);
INSERT INTO TABLE_SOURCE (AID, BID) VALUES (2, 1);

--例子1: [INSERT] 寫入目的資料表已存在的值
INSERT INTO TABLE_UNIQUE (AID) VALUES (1);

--例子2: [INSERT] 寫入的來源資料本身有重複
INSERT INTO TABLE_UNIQUE (AID)
SELECT AID FROM TABLE_SOURCE;

--例子3: [INSERT] (例子1 + 例子2) 的綜合情況
INSERT INTO TABLE_UNIQUE (AID)
SELECT BID FROM TABLE_SOURCE;

--例子4: [UPDATE] 更新的值,已存在唯一約束欄位中
UPDATE TABLE_UNIQUE SET AID = 3 WHERE AID = 1;

 

創用 CC 授權條款
本著作係採用創用 CC 姓名標示-相同方式分享 4.0 國際 授權條款授權,文章歡迎轉載,請註明出處,謝謝~~~