插入SQL时出现唯一键约束错误

时间:2016-01-14 06:17:25

标签: sql oracle oracle-sqldeveloper unique-key

有两个表x_ass_tablei_ass_table

我将来自x_ass_table的13000条记录的数据插入i_ass_table:

i_ass_table

中有一个唯一约束
 CREATE UNIQUE INDEX i_ass_table_pk ON i_ass_table(ASSIGNMENT_NUMBER,EFFECTIVE_START_DATE,EFFECTIVE_END_DATE,EFFECTIVE_LATEST_CHANGE)

insert into i_ass_table select * from x_ass_table;

我收到一个唯一的约束错误

00001. 00000 -  "unique constraint (%s.%s) violated"
*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.

这必须是数据的错误。但是,我如何检查13000条记录中的哪些数据是破碎的还是重复的

3 个答案:

答案 0 :(得分:2)

您可以使用count()函数的分析版本,通过组合您想要唯一的字段对源行进行编号,然后查询以查看哪个组合具有多个行。 E.g:

SELECT *
FROM   (SELECT *,
               COUNT() OVER (PARTITION BY assignment_number, 
                                          effective_start_date,
                                          effective_end_date,
                                          effective_latest_change) AS c
        FROM   x_ass_table) t
WHERE  c > 1

答案 1 :(得分:2)

正如您所问,您必须在两个表中检查唯一约束冲突。

  1. 首先检查x_ass_table是否有基于唯一键的重复记录,您可以使用Mureinik在上述答案中提供的查询进行检查。
  2. 其次,您必须检查两个表中是否存在基于唯一键的相同记录,该唯一键还可以创建唯一约束冲突。您可以查看以下查询。

    select *  
      from x_ass_table x,  
           i_ass_table i  
    where i.assignment_number = x.assignment_number  
      and i.effective_start_date = x.effective_start_date  
      and i.effective_end_date = x.effective_end_date  
      and i.effective_latest_change = x.effective_latest_change;
    

答案 2 :(得分:1)

你可以尝试

  

SELECT * FROM x_ass_table GROUP BY ASSIGNMENT_NUMBER HADING COUNT(*)> 1