用于 SQL Server 的 insert ignore into 的替代方案

Posted

技术标签:

【中文标题】用于 SQL Server 的 insert ignore into 的替代方案【英文标题】:Alternatives for insert ignore into for SQL server 【发布时间】:2018-12-04 11:25:11 【问题描述】:

我刚刚从 mysql 服务器切换到 SQL 服务器。但我刚刚发现INSERT INGORE INTO 不适用于sql server。 原代码:

INSERT IGNORE INTO DATA_EXACT_INVENTORY_LOCATIONS (ID, Code, Opslaglocatie, Omschrijving, OpVoorraad)
          VALUES ('$inventorylocationID','$inventorylocationsItemCode','$inventoryStorageLocationsCode','$inventorylocationsItemDescription','$inventorylocationsCurrenctStock')

我发现我可以使用on duplicate key update,但问题是我有多达 50 个变量的 sql 查询。因此,在重复密钥更新上使用将是很多工作。所以我想知道INSERT IGNORE INTO 是否有更好的选择,即插即用,所以我不必再次编写所有变量。

【问题讨论】:

使用合并语句或编写前端代码来捕获并忽略 PK 违规。 Kinda提出了一个问题,为什么您会遇到这些错误;您的并发使用策略可能需要一些改进 - 我会说“忽略”是与您尝试插入的数据有关的最糟糕的事情之一。 ps;我不认为 SQLS 有 on duplicate key update 所以一个合并语句是要走的路,但我能在合并上找到的所有信息都表明,合并可用于将两个表相互比较,然后更新、删除等。跨度> 【参考方案1】:

你可以使用not exists:

INSERT DATA_EXACT_INVENTORY_LOCATIONS (ID, Code, Opslaglocatie, Omschrijving, OpVoorraad)
    SELECT ID, Code, Opslaglocatie, Omschrijving, OpVoorraad
    FROM (VALUES ('$inventorylocationID', '$inventorylocationsItemCode', '$inventoryStorageLocationsCode', '$inventorylocationsItemDescription', '$inventorylocationsCurrenctStock')
         ) V(ID, Code, Opslaglocatie, Omschrijving, OpVoorraad)
    WHERE NOT EXISTS (SELECT 1
                      FROM DATA_EXACT_INVENTORY_LOCATIONS deil
                      WHERE deil.id = v.id -- or whatever column gets the duplicate key
                     );

或者,您可以重写代码以使用MERGESELECT 应该可以在两个数据库中使用。

我还要补充一点,你应该学会使用参数。使用常量值修改查询字符串会使您的代码遭受 SQL 注入攻击和难以调试的语法错误。

【讨论】:

以上是关于用于 SQL Server 的 insert ignore into 的替代方案的主要内容,如果未能解决你的问题,请参考以下文章

sql server 锁

SQL Server 数据库审核不适用于系统管理员用户

SQL Server 基本INSERT语句

mysql @@identity 与 sql-server last_insert_id()

sql server 2012中插入记录INSERT后面+INTO与不+之间有啥区别?

UTF-8 字符在 MS-SQL-Server 上的 INSERT 语句中发生更改