一、含义

ORA-00001: 违反唯一约束条件 (.)

二、定位


  1. 确认表中是否由唯一性约束
  1. SELECT A.*, B.CONSTRAINT_TYPE
  2.   FROM USER_CONS_COLUMNS A
  3.   LEFT JOIN USER_CONSTRAINTS B
  4.     ON A.CONSTRAINT_NAME = B.CONSTRAINT_NAME
  5.  WHERE CONSTRAINT_TYPE = 'P'
  6.    AND A.TABLE_NAME = '<表名>';
  1. select * from <表名> where <列名>='<id>'
  • 表名:插入语句出现异常的表的名称
  • 列名:该表中拥有唯一性约束的列的名称
  • id:运行该语句时的唯一性约束列的列值
  1. 如果没有相应数据,可以插入一条可插入的测试数据,试试是否是由其它原因引起的



三、故障原因



  1. 插入空值
    唯一约束的字段在插入数据时不能出现重复,可以为空,但是空也只能出现一次。比如说学生的学号设有唯一约束,那么就不能出现两个学号相同的学生,如果插入数据时出现有两条以上学生信息的学号相同,就会出现该异常。数据库表的主键就带有唯一约束,所以主键也是不能重复的。
  2. sequence
    在oracle中,主健不能自动生成,不过可以通过“序列”来实现,如果是这样的话,问题很可能就出在“序列”上了;ORACLE表主键ID突然从已经存在的ID值开始自动生成,导致违反主键唯一性约束;可以通过修改“序列”的NEXTID得以解决。
  • 查询表该列的最大值
  • 查询所用序列的当前值
  • 将序列能够产生的最小值增大。
  • DROP SEQUENCE <序列名>;
  • 重建序列,start with <最大值+1>
  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;
  • 重建完表和索引后,插入数据进行测试。