防止在远程数据库中插入重复项

时间:2019-04-28 11:30:39

标签: oracle error-handling insert

我在服务器S1中有表A1,在服务器S2中有表A2。

这些表具有相同的结构,我想通过INSERTdb_link从A1应用于A2。

问题是,我想防止由于唯一约束或唯一索引异常而导致整个语句失败。

我尝试使用DML-ERROR-LOGGING,但它不能与db_link(该语句引发的异常)一起使用。

我还检查了ignore_row_on_dupkey_index提示的选项, 但是在远程数据库上也有同样的问题。

该问题有解决方案吗?

我正在使用oracle 11g版本。

2 个答案:

答案 0 :(得分:0)

这也可能比较慢,但是由于您不希望逐行...

INSERT INTO T1 (c1, c2, ...)
SELECT c1, c2, ...
FROM T2
WHERE NOT EXISTS 
    (SELECT *
     FROM T1 
     WHERE T1.c1 = T2.c1 AND . . . );

除此之外,另一种方法是:删除约束,执行脏插入,删除重复项,恢复约束

答案 1 :(得分:0)

最后,

我发现当远程表成为目标时,将应用插入

本地是源不起作用。

但是,当远程表是源表而本地表是目标表时,请执行命令-错误记录正常工作。

(我们需要交换db_links的方向并从另一台服务器运行命令)。

示例:

--- use that:
-- connect to S2

-- run
insert into A2 select * from A1@S1.. log errors...;

--- instead of that:
-- connect to S1

-- run
insert into A2@S2 select * from A1.. log errors...;