一、含義
ORA-00001: 違反唯一約束條件 (.)
二、定位
- 確認表中是否由唯一性約束
- SELECT A.*, B.CONSTRAINT_TYPE
- FROM USER_CONS_COLUMNS A
- LEFT JOIN USER_CONSTRAINTS B
- ON A.CONSTRAINT_NAME = B.CONSTRAINT_NAME
- WHERE CONSTRAINT_TYPE = 'P'
- AND A.TABLE_NAME = '<表名>';
- select * from <表名> where <列名>='<id>'
- 表名:插入語句出現異常的表的名稱
- 列名:該表中擁有唯一性約束的列的名稱
- id:運行該語句時的唯一性約束列的列值
- 如果沒有相應數據,可以插入一條可插入的測試數據,試試是否是由其它原因引起的
三、故障原因
- 插入空值
唯一約束的字段在插入數據時不能出現重複,可以爲空,但是空也只能出現一次。比如說學生的學號設有唯一約束,那麼就不能出現兩個學號相同的學生,如果插入數據時出現有兩條以上學生信息的學號相同,就會出現該異常。數據庫表的主鍵就帶有唯一約束,所以主鍵也是不能重複的。 - sequence
在oracle中,主健不能自動生成,不過可以通過“序列”來實現,如果是這樣的話,問題很可能就出在“序列”上了;ORACLE表主鍵ID突然從已經存在的ID值開始自動生成,導致違反主鍵唯一性約束;可以通過修改“序列”的NEXTID得以解決。- 查詢表該列的最大值
- 查詢所用序列的當前值
- 將序列能夠產生的最小值增大。
- DROP SEQUENCE <序列名>;
- 重建序列,start with <最大值+1>
- 壞塊處理
- 如果沒有發現有重複的數據,或沒有唯一索引則可進行如下測試
- 將索引DROP,重新插入測試數據,查看ORA-00001是否依然存在
- 如果出現如下異常
ERROR at line 1:
ORA-00600: internal error code, arguments: [6002], [0], [227], [2], [0], [], [], []
則可能是表或表上的索引數據有壞塊或者表或表的索引結構存在問題 - 嘗試分析表及索引的結構
SQL> ANALYZE TABLE <表名> VALIDATE STRUCTURE CASCADE;
ORA-01499: table/index cross reference failure - see trace file
已經基本可以確定問題在表結構及其索引 - 嘗試對錶及相關索引進行重建:
SQL> alter TABLE <表名> move;
SQL> alter index <索引名> REBUILD; - 重建完表和索引後,插入數據進行測試。