SQL Server 的插入忽略的替代方案

7 php mysql sql sql-server

我刚刚从 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')
Run Code Online (Sandbox Code Playgroud)

我发现我可以使用on duplicate key update,但问题是我的 sql 查询最多包含 50 个变量。因此,用于重复密钥更新将需要大量工作。所以我想知道是否有更好的替代方案,INSERT IGNORE INTO即插即用,这样我就不必再次编写所有变量。

Gor*_*off 6

您可以使用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
                     );
Run Code Online (Sandbox Code Playgroud)

或者,您可以重写代码以使用MERGE. 应该SELECT在两个数据库中都有效。

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