SQL重复键错误 - 删除行并创建新行与更新行

时间:2015-04-12 11:48:33

标签: c# sql stored-procedures azure-sql-database

我正在使用Azure SQL并拥有一个客户端服务,每30分钟记录一次用户的位置和数据。它将这些数据从客户端上传到数据库,但我收到了错误。

我有这个存储过程:

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

但是当同一个用户的客户端使用相同的UserID上传数据时,我收到以下错误:

  

违反PRIMARY KEY约束'PrimaryKey_asdad'。无法在对象'dbo.ThisIsMyTable'中插入重复键。重复键值   是(TheUsersUserID)。声明已经终止。

如何更改存储过程并检查密钥是否已存在,如果是,请更新lat / lon ..或者删除行并创建新行更好?

尼尔斯

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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 :(得分:0)

您可以在SQL中合并语句,更多详细信息请参见:https://msdn.microsoft.com/en-us/library/bb510625.aspx