【问题标题】:Use of IGNORE_DUP_KEY in Oracle database (sqlplus)Oracle数据库中IGNORE_DUP_KEY的使用(sqlplus)
【发布时间】:2014-01-15 18:17:24
【问题描述】:

我试图在少于 10000 行上运行以下代码,但我得到了

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 不支持此功能。你有其他选择吗?

【问题讨论】:

  • 没有像IGNORE_DUP_KEY 这样的提示——你的意思是IGNORE_ROW_ON_DUPKEY_INDEX吗?
  • 禁用约束并尝试更新
  • 你是对的:IGNORE_ROW_ON_DUPKEY_INDEX。我不允许禁用约束,我不想:) 我只想更新尽可能多的行并手动修复其余行。

标签: sql oracle sqlplus


【解决方案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'));

【讨论】:

    【解决方案2】:

    首先,看起来异常消息 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)
    

    【讨论】:

    • 是的,但我想跳过这些并继续下一行。如果 Oracle 支持,这就是 IGNORE_DUP_KEY 应该做的。
    • 我提供了一个替代方案。但是,也可能有其他方法可以做到这一点。
    • 谢谢,我会尝试解决方案:)
    猜你喜欢
    • 2013-03-17
    • 2012-02-29
    • 2018-06-30
    • 1970-01-01
    • 2015-04-27
    • 2018-11-11
    • 2023-03-22
    • 2012-07-05
    • 2010-09-09
    相关资源
    最近更新 更多