2014-01-15 89 views
4

我試圖運行不到10000行下面的代碼,但我得到使用Oracle數據庫(SQLPLUS)IGNORE_DUP_KEY

ORA-00001:唯一約束(constraint_name命令)侵犯(未意外)。

UPDATE table1 
    SET EMAILADRESSE = replace(EMAILADRESSE,'@domain1.no','@domain2.no') 
WHERE EMAILADRESSE LIKE '%@domain1.no' ; 

試過IGNORE_DUP_KEY,但這不是在Oracle/SQL * PLUS支持至於我的研究顯示。你有替代品嗎?

+0

沒有'IGNORE_DUP_KEY'這樣的提示 - 你的意思是'IGNORE_ROW_ON_DUPKEY_INDEX'嗎? –

+0

禁用約束並嘗試更新 – Sai

+0

您是對的:IGNORE_ROW_ON_DUPKEY_INDEX。我不允許禁用約束,我不想:)我只想更新儘可能多的行並手動修復其餘行。 – larsvemund

回答

1

另一個與NOT EXISTS

UPDATE table1 t1 
    SET EMAILADRESSE = replace(EMAILADRESSE,'@domain1.no','@domain2.no') 
WHERE EMAILADRESSE LIKE '%@domain1.no' 
AND NOT EXISTS 
(SELECT 'X' FROM table1 t2 WHERE t2.EMAILADRESSE = replace(t1.EMAILADRESSE,'@domain1.no','@domain2.no')); 
+0

Tnx。這解決了它:) – larsvemund

0

首先,它看起來看着異常消息EMAILADRESSE列有一個獨特的約束。您正試圖通過更改至少一個帶有替換域名的電子郵件地址已存在的電子郵件域來更新table1。

UPDATE table1 
    SET EMAILADRESSE = replace(EMAILADRESSE,'@domain1.no','@domain2.no') 
    WHERE EMAILADRESSE LIKE '%@domain1.no' AND replace(EMAILADRESSE,'@domain1.no','@domain2.no') NOT IN (SELECT EMAILADRESSE FROM table1) 
+0

是的,但我想跳過thoose並移動到下一行。這是IGNORE_DUP_KEY如果Oracle支持它應該做的。 – larsvemund

+0

我提供了一個替代方案。但是,也可以採用其他方式來實現。 – IndoKnight

+0

謝謝,我會嘗試解決方案:) – larsvemund