2015-04-12 72 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)