ITPub博客

首页 > 数据库 > Oracle > ORA-02299: cannot validate (SSERVICE.UK_MSI_WDR_INPUT) - duplicate keys found

ORA-02299: cannot validate (SSERVICE.UK_MSI_WDR_INPUT) - duplicate keys found

原创 Oracle 作者:许愿流星1号 时间:2015-12-02 15:43:19 0 删除 编辑

-数据库在创建unique constraint的同时,强制创建或者重用列上的索引。如果之前列上没有索引,那么强制创建的索引是unique index,如果列上已经存在索引,就重用之前的索引。

 

 

为了避免出现重复数据,在现有的表上面添加unique constraint,而又不影响现有数据。

 

1. SQL> alter table msi_wdr_input add constraint UK_MSI_WDR_INPUT unique(msifilesiteid,postdate,linetype,value001,value002,value003,value004) enable novalidate;

 

alter table msi_wdr_input add constraint UK_MSI_WDR_INPUT unique(msifilesiteid,postdate,linetype,value001,value002,value003,value004) enable novalidate

 

ORA-02299: cannot validate (SSERVICE.UK_MSI_WDR_INPUT) - duplicate keys found

 

因为数据表中存在重复数据,导致了unique constraint 没有建立成功。

 

2. SQL> alter table msi_wdr_input add constraint UK_MSI_WDR_INPUT unique(msifilesiteid,postdate,linetype,value001,value002,value003,value004) deferrable enable novalidate;

 

Table altered

 

加上 deferrable enable novalidate (延迟约束验证),就可以对原数据不做验证,在以后插入数据时,做唯一性验证。

 

添加数据测试:

 

SQL> insert into msi_wdr_input(msifilesiteid,postdate,linetype,value001,value002,value003,value004)

  2  values('AJAG',to_date('04-04-2009','DD-MM-YYYY'),1,'1103','Occ Tax - State','1278.88','0.00');

 

insert into msi_wdr_input(msifilesiteid,postdate,linetype,value001,value002,value003,value004)

values('AJAG',to_date('04-04-2009','DD-MM-YYYY'),1,'1103','Occ Tax - State','1278.88','0.00')

 

ORA-00001: unique constraint (SSERVICE.UK_MSI_WDR_INPUT) violated

 

违反了唯一性约束,插入失败。

 

 

 

另:在oracle中,(1)null代表数据缺失,一个null不存在与任何值(包括其它null)等或者不等。所以,在给单列加Unique约束时,是允许为它存在多个null的。(2)在组合键中,只要不为null的keys都对应相等,那么Oracle会把null的keys译为相等。比方说,一个有三列组成(A,B,C)的组合唯一约束。如果C列为null,那么两条记录是否违反唯一约束,就看另外两列是否对应相等。如 (1,2,null) 和 (1,2,null)就视为违反唯一性约束

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29893219/viewspace-1851597/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-09-18

  • 博文量
    46
  • 访问量
    395146