SQL Server是否在重复密钥更新时提供类似MySQL的任何内容

时间:2009-07-29 02:06:04

标签: mysql sql-server tsql

在MySQL中,如果指定ON DUPLICATE KEY UPDATE并且插入了会导致UNIQUE索引或PRIMARY KEY中出现重复值的行,则会执行旧行的UPDATE。例如,如果列a声明为UNIQUE并且包含值1,则以下两个语句具有相同的效果:

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=c+1;

UPDATE table SET c=c+1 WHERE a=1;

我不相信我在T-SQL中遇到过类似的东西。 SQL Server是否提供了与MySQL的ON DUPLICATE KEY UPDATE相当的东西?

5 个答案:

答案 0 :(得分:44)

没有DUPLICATE KEY UPDATE等价物,但MERGE和WHEN MATCHED可能适用于你

Inserting, Updating, and Deleting Data by Using MERGE

答案 1 :(得分:31)

我感到惊讶的是,此页面上的答案都没有包含实际查询的示例,所以请转到:

插入数据然后处理重复

的更复杂的示例
MERGE
INTO MyBigDB.dbo.METER_DATA WITH (HOLDLOCK) AS target
USING (SELECT
    77748 AS rtu_id
   ,'12B096876' AS meter_id
   ,56112 AS meter_reading
   ,'20150602 00:20:11' AS local_time) AS source
(rtu_id, meter_id, meter_reading, time_local)
ON (target.rtu_id = source.rtu_id
  AND target.time_local = source.time_local)
WHEN MATCHED
  THEN UPDATE
      SET meter_id = '12B096876'
         ,meter_reading = 56112
WHEN NOT MATCHED
  THEN INSERT (rtu_id, meter_id, meter_reading, time_local)
      VALUES (77748, '12B096876', 56112, '20150602 00:20:11');

答案 2 :(得分:3)

SQL Server 2008具有此功能,作为TSQL的一部分 请参阅MERGE声明文档 - http://msdn.microsoft.com/en-us/library/bb510625.aspx

答案 3 :(得分:1)

SQL Server 2000以后有一个概念而不是触发器,它可以实现所需的功能 - 尽管会在幕后隐藏一个令人讨厌的触发器。

请查看“插入或更新?”部分

http://msdn.microsoft.com/en-us/library/aa224818(SQL.80).aspx

答案 4 :(得分:0)

您可以尝试其他方法。它或多或少地做同样的事情。

UPDATE tablename 
SET    field1 = 'Test1', 
       field2 = 'Test2' 
WHERE  id = 1 

IF @@ROWCOUNT = 0 
  INSERT INTO tablename 
              (id, 
               field1, 
               field2) 
  VALUES      (1, 
               'Test1', 
               'Test2')