什么是MS SQL Server中的“INSERT IGNORE”等价物?

时间:2014-01-19 18:23:49

标签: mysql sql-server sql-insert openquery

我正在尝试使用“OPENQUERY”从MS SQL Server将记录插入MySQL数据库,但我要做的是忽略重复的密钥消息。因此,当查询遇到重复时,请忽略它并继续运行。

我可以做些什么来忽略重复?

这是我正在做的事情:

  1. 使用“OpenQuery”从MySQL中提取记录来定义MySQL“A.record_id”
  2. 从这里将这些记录连接到MS SQL Server中的记录“具有特定标准而非直接ID”我在SQL Server中找到了一个新的相关“B.new_id”记录标识符。
  3. 我想将找到的结果插入到MySQL的新表中,如同A.record_id,B.new_id在新表中,我将A.record_id设置为该表的主键。
  4. 问题在于,当将表A连接到表B时,有时我会在表B中找到2条记录,这些记录与我要查找的条件相匹配,这会导致在插入之前我的数据集中的值A.record_id超过2倍进入表A导致问题。注意我可以使用聚合函数来消除记录。

2 个答案:

答案 0 :(得分:13)

我认为没有具体的选择。但这很容易做到:

insert into oldtable(. . .)
    select . . .
    from newtable
    where not exists (select 1 from oldtable where oldtable.id = newtable.id)

如果有多组唯一键,则可以添加其他not exists语句。

编辑:

修订后的问题:

insert into oldtable(. . .)
    select . . .
    from (select nt.*, row_number() over (partition by id order by (select null)) as seqnum
          from newtable nt
         ) nt
    where seqnum = 1 and
          not exists (select 1 from oldtable where oldtable.id = nt.id);

row_number()函数为一组行中的每一行分配一个序号。该组由partition by语句定义。数字从1开始并从那里开始递增。 order by条款表示您不关心订单。每个id恰好一行的值为1.重复行的值大于1。 seqnum = 1每个ID只选择一行。

答案 1 :(得分:10)

如果您使用的是SQL Server 2008+,则可以使用MERGE执行INSERT(如果行不存在)或UPDATE

示例:

MERGE
INTO    dataValue dv
USING   tmp_holding_DataValue t
ON      t.dateStamp = dv.dateStamp
        AND t.itemId = dv.itemId
WHEN NOT MATCHED THEN
INSERT  (dateStamp, itemId, value)
VALUES  (dateStamp, itemId, value)