-数据库在创建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/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29893219/viewspace-1851597/