SQL Server是否提供类似MySQL的重复密钥更新
在MySQL中,如果指定并插入一行,这将导致在唯一索引或主键中出现重复值,则会执行旧行的更新。例如,如果列a声明为唯一且包含值1,则以下两条语句具有相同的效果: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相同的重复密钥更新功能?没有类似的
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是内存优化的吗?若要查找表是否经过内存优化,请参阅-