【问题标题】:Oracle equivalent of MySQL update ignoreOracle 等效于 MySQL 更新忽略
【发布时间】:2011-11-18 07:29:50
【问题描述】:

我需要运行一个违反唯一约束的 Oracle 查询,只针对不会违反约束的记录。在 MySQL 中,我相信这可以使用 ignore 命令来完成。 Oracle 中是否有等价物?

【问题讨论】:

    标签: mysql sql oracle constraints sql-update


    【解决方案1】:

    很难明确地说不(Oracle 很大),但在 15 年的数据库编程中,我从未在 Oracle 中看到过这样的功能。您可以禁用约束,但这与您在此处尝试完成的操作不同。

    一种解决方法是编写一些 PL/SQL 来处理您正在逐行更新的表,尝试进行更新并吞下任何错误。这不会是有效的,但它会起作用。但是在我能想象的每一种情况下(除非你有一个非常非常复杂的表),你应该能够编写你的更新查询来包含适当的子查询来解决约束。确切的策略取决于表和查询。

    【讨论】:

      【解决方案2】:

      您可以为此使用 Oracle 的错误日志功能:

      首先,您需要创建一个稍后将包含被忽略行的表:

      EXECUTE DBMS_ERRLOG.CREATE_ERROR_LOG('YOUR_TABLE', 'YOUR_TABLE_ERROR_LOG');
      

      这将为名为 YOUR_TABLE 的表创建一个名为 YOUR_TABLE_ERROR_LOG 的表(显然您只需执行一次)。

      当您运行 UPDATE 时,您需要添加 LOG ERRORS 子句:

      UPDATE your_table
         SET ...
      WHERE ...
      LOG ERRORS INTO YOUR_TABLE_ERROR_LOG ('UPDATE running at '||to_char(sysdate, 'yyyy-MM-dd HH24:MI:SS')) 
      REJECT LIMIT UNLIMITED;
      

      指定的字符串是一个任意值,可帮助您识别产生错误的操作。

      更新后,您可以查询表 YOUR_TABLE_ERROR_LOG 以查看发生了哪些错误以及原因。如果您对错误不感兴趣,只需在之后截断错误日志表即可。

      更多详情见手册:
      http://download.oracle.com/docs/cd/E11882_01/server.112/e17118/statements_10008.htm#BCEFBFCD

      编辑 2014-10-27

      从 Oracle 11.2 开始,有一个名为 CHANGE_DUPKEY_ERROR_INDEX 的新提示可用于此目的。不过我从来没有尝试过。

      手册中的详细信息: http://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements006.htm#CHDIFFJE

      对于INSERT 操作,有一个类似的提示,名为IGNORE_ROW_ON_DUPKEY_INDEX:
      http://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements006.htm#CHDEGDDG

      一些例子:

      【讨论】:

        猜你喜欢
        • 2019-06-21
        • 1970-01-01
        • 1970-01-01
        • 2020-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多