2009-07-29 17 views
43

MySQL'de, ON DUPLICATE KEY UPDATE belirtirseniz ve UNIQUE dizininde veya PRIMARY KEY'de yinelenen bir değere neden olacak bir satır eklenirse, eski satırın UPDATE'si gerçekleştirilir.SQL Server, MySQL's DUPLICATE ANAHTAR GÜNCELLEME Gibi Bir Şey Sunar

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; 

Ben T-SQL benzeri bir şey rastlamak yok galiba: sütun UNIQUE olarak ilan ve değer 1 içeriyorsa Örneğin, şu iki ifade aynı etkiye sahiptir. SQL Server MySQL'in ON DUPLICATE KEY UPDATE ile karşılaştırılabilir bir şey sunuyor mu?

+0

Kayıtlı bir yordamla simüle edebilirsiniz. Kafamın üst kısmındaki kodun tam olarak yok. –

+0

@Robert Harvey - Satır mevcut olup olmadığını kontrol ederek her zaman işlem yaptım. Evet ise, bir güncelleme yapın, yeni bir satır ekleyin. Sen de böyle düşündün mü? –

cevap

35

Hiçbir YİNELENEN KEY GÜNCELLEME eşdeğer, ama BİRLEŞMEK ve MATCHED ZAMAN sen

Inserting, Updating, and Deleting Data by Using MERGE

+11

Sadece MERGE'nin yüksek eşzamanlı ekleme çarpışmalarına karşı bağışık olmadığını unutmayın. ** **, çarpışmamak için birleştirme için WITH (UPDLOCK, HOLDLOCK) kullanmalısınız. Bazı ultra yüksek işlem başına saniye sistemleri, kilitlerin kullanılmadığı farklı bir strateji kullanır, ancak herhangi bir hata yakalanır ve daha sonra bir güncellemeye dönüştürülür. – ErikE

+3

bu kullanıcı adı daha fazla oyu hak ediyor. – Pete

2

SQL Server 2008 Bu özelliğe sahip için TSQL bir parçası olarak, işe yarayabilir. Burada birleştirme deyimini üzerinde
Bkz dokümantasyon - perde arkasında saklanarak kötü tetik olacak olsa - http://msdn.microsoft.com/en-us/library/bb510625.aspx

+1

Sadece MERGE'nin yüksek eşzamanlı ekleme çarpışmalarına karşı bağışık olmadığını unutmayın. Çatışmamak için Birleştirme (UPDLOCK, HOLDLOCK) kullanmalısınız. Bazı ultra yüksek işlem başına saniye sistemleri, kilitlerin kullanılmadığı farklı bir strateji kullanır, ancak herhangi bir hata yakalanır ve daha sonra bir güncellemeye dönüştürülür. – ErikE

16

, işte gidip:

veri ekleme ve sonra taşıma Daha karmaşık bir örnek

çoğaltmak
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'); 
+4

Siz efendim ... hayat kurtarıcıdır. , Id id AS: Gerçekten onlar her zaman en sık – Tschallacka

+0

' \t \t \t (SEÇ KULLANARAK hedefe \t \t \t AS MyFancyTableName İLE (HOLDLOCK) INTO BİRLEŞMEK 'kullanılanlar dışında kalan tüm örnekler vermek ... microsoft dokümantasyon hate : \t \t \t (target.id source = AÇIK kaynak \t \t \t (id, LastAccess OLARAK LastAccess OLARAK LastAccess)) \t \t \t.' 'I hem göndermek gerekir mi; lastaccess3): SONRA MATCHED id) \t \t \t GÜNCELLEME SET LastAccess =: kimlik2: (id, LastAccess) \t \t \t DEĞERLER (INSERT SONRA MATCHED DEĞİL NE ZAMAN \t \t \t lastaccess2 '' '' '' '' 'değişkenleri seçer ya da sadece 'id' yeterli olur mu? – Tschallacka

+0

Birleştirme komutu başvurusu için teşekkürler. Bunu, MATCHED STATEMENTS'de, kaynak olarak tanımladığınız değerleri kullandığınızı göstermeliyim. Bu yüzden, eğer bir güncelleme kaydı yapmak istiyorsanız, aşağıdaki gibi bir kaynak değeri belirtmelisiniz: –