2015-04-12 70 views
0

我正在使用Azure SQL並具有客戶端服務,該客戶端服務每隔30分鐘記錄用戶的位置和數據。它將來自客戶端的這些數據上傳到數據庫,但我收到錯誤。SQL重複鍵錯誤 - 刪除行並創建新行與更新行

我有這個存儲過程:

INSERT INTO ThisIsMyTable(UserID, Latitude, Longitude) 
VALUES (@UserID, @Latitude, @Longitude) 

但是,當具有相同UserID我得到下面的錯誤相同的用戶的客戶端上傳數據:

Violation of PRIMARY KEY constraint 'PrimaryKey_asdad'. Cannot insert duplicate key in object 'dbo.ThisIsMyTable'. The duplicate key value is (TheUsersUserID). The statement has been terminated.

我怎樣才能改變存儲程序,並檢查密鑰是否已經存在,如果是 - 更新緯度/經度。或者將刪除行並創建一個新的更好?

尼爾斯

+1

有可能是有益的,在這裏使用一個MERGE語句。我相信它在Azure SQL中得到了支持 –

+0

對於上面的腳本,我將如何使用它?我的SQL知識非常有限。什麼合併doe ..基本上更新與舊的價值觀? – Niels

+0

@Niels - 根據接受的答案,如果'用戶ID'不能用於數據庫插入的時間超過一次,那麼應用程序本身存在某些錯誤。 RE:「...每30分鐘記錄用戶的位置和數據」 - 如果是這種情況,「UserID」只能插入一次,然後每30分鐘覆蓋一次,而不是每30分鐘創建一條新記錄。如果這不是所希望的行爲,那麼很可能是'ThisIsMyTable'被錯誤地定義爲將'UserID'列定義爲PK,或者'TheUsersUserID'未被正確定義/設置。 –

回答

2
if exists (select 1 from ThisIsMyTable where UserID = @UserID) 

    update ThisIsMyTable 
    set latitude = @latitude, longitude = @longitude 
    where UserID = @UserID 

else 

    INSERT INTO ThisIsMyTable (UserID, Latitude, Longitude) 
    VALUES (@UserID, @Latitude, @Longitude) 
2
MERGE INTO ThisIsMyTable AS Target 
USING (VALUES (@UserID,@Latitude, @Longitude) 
     AS Source (UserID, Lat, Long) 
ON Target.UserID = Source.UserID 
WHEN MATCHED THEN 
UPDATE SET Latitude = Source.Lat, Longitude=Source.Long 
WHEN NOT MATCHED BY TARGET THEN 
INSERT (UserID, Latitude, Longitude) VALUES (UserID, Lat, Long)