2014-01-15 51 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