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 等效项的主要内容,如果未能解决你的问题,请参考以下文章