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

許願流星1號發表於2015-12-02

-資料庫在建立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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章