IGNORE_DUP_KEY 的 DB2 等效项

Posted

技术标签:

【中文标题】IGNORE_DUP_KEY 的 DB2 等效项【英文标题】:DB2 Equivalent of IGNORE_DUP_KEY 【发布时间】:2020-10-14 07:12:20 【问题描述】:

我有 3 个数据库 ion Oracle、SQL Server 和 DB2。

来源数据库:甲骨文 目标数据库:SQL Server / DB2

我们每天都必须将数据从 Oracle 迁移到 SQL Server 并将 Oracle 迁移到 DB2。在 C# 应用程序中,我们使用 BCP。

在 SQL Server 中,表具有 IGNORE_DUP_KEY 的唯一索引。因此,如果我们有重复的数据,那么它就会被忽略,并且所有其他数据都被成功复制。 https://techcommunity.microsoft.com/t5/sql-server/...

但是,在 DB2 中,如果存在重复数据,则整个事务都会回滚。 DB2 中是否有任何 SQL Server 等效选项或我们可以通过 C# BCP (https://www.ibm.com/support/producthub/db2/docs/co...) 执行的操作

我想出了一个替代方法,将 Oracle 中的所有数据转储到一个文件中,然后使用 DB2 Import,因为它会跳过重复记录并完成事务。这没问题,但不是一个很好的解决方案,因为我们必须在应用程序中为 DB2 编写特定的内容。

谢谢

【问题讨论】:

什么工具或程序正在执行插入或加载到 Db2 表中。 Db2-LUW 中没有 IGNORE_DUP_KEY 作为唯一索引的属性这样的概念。相反,可以在应用程序层模拟这种行为(捕获重复键的异常,并吞下它,然后继续而不是回滚。所以这是应用程序层的决定。应用程序可以插入/而不是转储到文件和导入,而不是转储到文件和导入加载到临时表中,然后在最终表中执行merge,忽略作为合并的一部分的重复项。 【参考方案1】:

一种方法是使用not exists:

insert into t ( . . . )
    select . . . 
    from staging s
    where not exists (select 1 from s.id = t.id);

您可能需要为每个唯一约束 (and not exists . . . ) 执行此操作。

如果新表本身可能有重复,则添加row_number() 过滤器:

insert into t ( . . . )
    select . . .
    from (select s.*,
                 row_number() over (partition by id order by id) as seqnum
          from staging s
         ) s
    where seqnum = 1 and
          not exists (select 1 from s.id = t.id);

请注意,这些不是线程安全的,但它们应该适用于批量加载。

【讨论】:

以上是关于IGNORE_DUP_KEY 的 DB2 等效项的主要内容,如果未能解决你的问题,请参考以下文章

Java 中协议缓冲区分隔的 I/O 函数是不是有 C++ 等效项?

在同一函数中定义变量及其静态等效项

OpenCV 中的 Matlab 最小等效项

此 SQL 查询的 MongoDB 等效项

DOMNodeInserted 在 IE 中的等效项?

将 errno.h 错误值转换为 Win32 GetLastError() 等效项