用于 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
);
或者,您可以重写代码以使用MERGE
。 SELECT
应该可以在两个数据库中使用。
我还要补充一点,你应该学会使用参数。使用常量值修改查询字符串会使您的代码遭受 SQL 注入攻击和难以调试的语法错误。
【讨论】:
以上是关于用于 SQL Server 的 insert ignore into 的替代方案的主要内容,如果未能解决你的问题,请参考以下文章
mysql @@identity 与 sql-server last_insert_id()