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

Jay*_*len 15 mysql sql-server openquery sql-insert

我试图使用"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设置为该表的主键.

问题是,当将表A连接到表B时,有时我会在表B中找到2条以上的记录,这些记录与我要查找的条件相匹配,这会导致我的数据集中的值A.record_id超过2倍,然后将其插入表A中这导致了问题.注意我可以使用聚合函数来消除记录.

Gor*_*off 13

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

insert into oldtable(. . .)
    select . . .
    from newtable
    where not exists (select 1 from oldtable where oldtable.id = newtable.id)
Run Code Online (Sandbox Code Playgroud)

如果有多组唯一键,则可以添加其他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);
Run Code Online (Sandbox Code Playgroud)

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

  • "这很容易做到" - 除了INSERT IGNORE之外根本不容易.这实际上是非常令人讨厌的. (2认同)

Bar*_*ein 11

如果您使用的是SQL Server 2008+,则可以使用if MERGE来执行INSERTif不存在的行或者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)
Run Code Online (Sandbox Code Playgroud)

  • 问题和标题令人困惑,相反.我查看了标题,其中@Mike在SQL Server中要求提供相同于MySQL的"INGORE INSERT".而问题则相反,即从SQL Server插入MySQL. (3认同)