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

C# SQL重复键错误-删除行并创建新行与更新行,c#,sql,stored-procedures,azure-sql-database,C#,Sql,Stored Procedures,Azure Sql Database,我使用的是Azure SQL,有一个客户端服务,每30分钟记录一次用户的位置和数据。它将这些数据从客户端上传到数据库,但我得到了错误 我有一个存储过程: INSERT INTO ThisIsMyTable(UserID, Latitude, Longitude) VALUES (@UserID, @Latitude, @Longitude) 但是,当同一用户的客户端使用相同的UserID上传数据时,我得到以下错误: 违反主键约束“PrimaryKey_asdad”。无法在对象“dbo.This

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

我有一个存储过程:

INSERT INTO ThisIsMyTable(UserID, Latitude, Longitude)
VALUES (@UserID, @Latitude, @Longitude)
但是,当同一用户的客户端使用相同的
UserID
上传数据时,我得到以下错误:

违反主键约束“PrimaryKey_asdad”。无法在对象“dbo.ThisIsMyTable”中插入重复键。重复的键值 是(用户suserid)。声明已终止

如何更改存储过程并检查密钥是否已存在,如果已存在,则更新lat/lon。。还是删除该行并创建一个新行更好


Niels

您可以在SQL中合并语句,此处有更多详细信息:

您可以在SQL中合并语句,此处有更多详细信息:

此处有一个可能有益于使用的合并语句。我相信它在Azure SQL中是受支持的。我如何在上面的脚本中使用它?我的SQL知识相当有限。合并是什么意思。。基本上是用新的?@Niels更新旧值-根据公认的答案,如果
UserID
不能多次用于数据库插入,则应用程序存在固有的问题。RE:“…每30分钟记录一次用户的位置和数据”-如果是这种情况,则
用户ID只能插入一次,然后每30分钟覆盖一次,而不是每30分钟创建一条新记录。如果这不是所需的行为,则很可能是
ThisIsMyTable
被错误地定义为将
UserID
列定义为PK,或者
TheUsersUserID
未被正确定义/设置。事实并非如此。。我只需要最新的Lat/Lon,不想保留所有记录(隐私+数据库大小+不需要)。替换行或用最新数据更新行就足够了。这里有一个MERGE语句可能会对您有所帮助。我相信它在Azure SQL中是受支持的。我如何在上面的脚本中使用它?我的SQL知识相当有限。合并是什么意思。。基本上是用新的?@Niels更新旧值-根据公认的答案,如果
UserID
不能多次用于数据库插入,则应用程序存在固有的问题。RE:“…每30分钟记录一次用户的位置和数据”-如果是这种情况,则
用户ID只能插入一次,然后每30分钟覆盖一次,而不是每30分钟创建一条新记录。如果这不是所需的行为,则很可能是
ThisIsMyTable
被错误地定义为将
UserID
列定义为PK,或者
TheUsersUserID
未被正确定义/设置。事实并非如此。。我只需要最新的Lat/Lon,不想保留所有记录(隐私+数据库大小+不需要)。替换行或用最新数据更新行就足够了。
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)
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)