Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server是否提供类似MySQL的重复密钥更新_Mysql_Sql Server_Tsql - Fatal编程技术网

SQL Server是否提供类似MySQL的重复密钥更新

SQL Server是否提供类似MySQL的重复密钥更新,mysql,sql-server,tsql,Mysql,Sql Server,Tsql,在MySQL中,如果指定并插入一行,这将导致在唯一索引或主键中出现重复值,则会执行旧行的更新。例如,如果列a声明为唯一且包含值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相同的重复密钥更新功能?没有类似的

在MySQL中,如果指定并插入一行,这将导致在唯一索引或主键中出现重复值,则会执行旧行的更新。例如,如果列a声明为唯一且包含值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相同的重复密钥更新功能?

没有类似的重复密钥更新功能,但是合并和匹配可能适合您


SQLServer2008具有此功能,作为TSQL的一部分。
请参阅此处有关MERGE语句的文档-

SQL server 2000及以后版本有一个替代触发器的概念,它可以实现所需的功能-尽管在幕后会隐藏一个讨厌的触发器

检查章节插入或更新


我感到惊讶的是,本页的答案中没有一个包含实际查询的示例,因此,请看:

插入数据然后处理重复数据的更复杂示例

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');

你可以试试另一种方法。它或多或少做同样的事情

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

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

您可以使用存储过程来模拟它。我脑子里没有确切的代码。@Robert Harvey-我总是通过检查行是否存在来执行操作。如果是,则执行更新,否则插入新行。您也是这么想的吗?请注意,合并并不能避免高并发插入冲突。必须与UPDLOCK、HOLDLOCK一起使用,才能使合并不发生碰撞。一些超高每秒事务数的系统使用不同的策略,其中不使用锁,但任何错误都会被捕获,然后转换为更新。请注意,合并不能避免高并发插入冲突。必须与UPDLOCK、HOLDLOCK一起使用,才能使合并不发生碰撞。一些超高每秒事务数的系统使用不同的策略,不使用锁,但任何错误都会被捕获,然后转换为更新。先生。。。你是救命恩人。我真的很讨厌微软的文档。。。它们总是给出除最常用的示例之外的所有示例“合并到MyFancyTableName中,以HOLDLOCK作为目标,使用SELECT:id作为id,:lastaccess作为lastaccess作为源id,目标上的lastaccess.id=源.id匹配时更新集lastaccess=:lastaccess2不匹配时插入id,lastaccess值:id2,:lastaccess3;'我需要在usingselect中发布这两个变量吗?还是只需要id就足够了?谢谢您对Merge命令的引用。我应该指出,在匹配的语句中,您使用的值与您定义为源的值相同。因此,如果您希望更新大量记录,您应该像这样指定源值:匹配后,更新设置METER\u ID=source.RTU\u ID,METER\u READING=source.METER\u ID。很抱歉,重复评论,stackoverflow在过去6分钟内不允许我编辑。我尝试使用MERGE-in,但出现了一个错误,无法在内存优化的表上使用它。默认情况下,使用CREATETABLE语句创建的表是内存优化的表。我不知道和HOLDLOCK一起使用是否有效。我会试试看。顺便说一句,代码中的表-MyBigDB.dbo.METER_DATA是内存优化的吗?若要查找表是否经过内存优化,请参阅-