2009-07-29 62 views
43

在MySQL中,如果指定ON DUPLICATE KEY UPDATE並且插入的行會導致UNIQUE索引或PRIMARY KEY中出現重複值,則會執行舊行的UPDATE。例如,如果列被聲明爲UNIQUE,並且包含值1,以下兩個語句具有相同的效果: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的DUPLICATE KEY UPDATE相媲美的功能?

+0

您可以使用存儲過程來模擬它。我的頭腦裏沒有確切的代碼。 – 2009-07-29 02:13:05

+0

@羅伯特哈維 - 我一直通過檢查行是否存在來執行操作。如果是,則執行更新,否則插入新行。這是你在想什麼嗎? – 2009-07-29 02:52:32

回答

35

有沒有重複的密鑰更新相當,但合併,WHEN MATCHED可能爲你工作

Inserting, Updating, and Deleting Data by Using MERGE

+11

請注意,MERGE不能抵抗高併發插入衝突。您**必須**使用WITH(UPDLOCK,HOLDLOCK)進行合併以避免碰撞。一些超高每秒事務處理系統在不使用鎖的情況下使用不同的策略,但是任何錯誤都會被捕獲並轉換爲更新。 – ErikE 2010-10-02 01:03:29

+3

此用戶名稱值得更多選票。 – Pete 2012-11-21 00:38:32

16

我很驚訝,沒有此頁面上的答案包含實際查詢的例子,所以在這裏你去:

插入數據,然後處理的更復雜的例子複製

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