【发布时间】:2011-11-18 07:29:50
【问题描述】:
我需要运行一个违反唯一约束的 Oracle 查询,只针对不会违反约束的记录。在 MySQL 中,我相信这可以使用 ignore 命令来完成。 Oracle 中是否有等价物?
【问题讨论】:
标签: mysql sql oracle constraints sql-update
我需要运行一个违反唯一约束的 Oracle 查询,只针对不会违反约束的记录。在 MySQL 中,我相信这可以使用 ignore 命令来完成。 Oracle 中是否有等价物?
【问题讨论】:
标签: mysql sql oracle constraints sql-update
很难明确地说不(Oracle 很大),但在 15 年的数据库编程中,我从未在 Oracle 中看到过这样的功能。您可以禁用约束,但这与您在此处尝试完成的操作不同。
一种解决方法是编写一些 PL/SQL 来处理您正在逐行更新的表,尝试进行更新并吞下任何错误。这不会是有效的,但它会起作用。但是在我能想象的每一种情况下(除非你有一个非常非常复杂的表),你应该能够编写你的更新查询来包含适当的子查询来解决约束。确切的策略取决于表和查询。
【讨论】:
您可以为此使用 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
一些例子:
【讨论】: