使用INSERT ... ON DUPLICATE KEY UPDATE和几个键

时间:2015-06-27 11:34:43

标签: php mysql sql sql-insert on-duplicate-key

我有一个数据库,其中我想要三个键中的一个(userId,udid和token)来识别行:它们都是唯一键,第一个也是主键和自动增量键。基本上我想在其中一个键相同时更新所有值。不幸的是,如果我使用:

INSERT INTO users (udid, nickname, playerID, `language`, app, token,
 `In Arrivo HD`) VALUES ('AB71C145-2FFE-4BA8-B0E7-9F121948C962', 'Fabry65', 'G:274138044', 'it_IT', 'In Arrivo HD', 
'605a383a7e3469a3da0b471cd5b73af7384ca5e389eeb7cd72e550e96f37f450', NOW()+ INTERVAL 1 YEAR) 
ON DUPLICATE KEY UPDATE udid='AB71C145-2FFE-4BA8-B0E7-9F121948C962', 
token='605a383a7e3469a3da0b471cd5b73af7384ca5e389eeb7cd72e550e96f37f450',  lastAccess=NOW(), active=1, nickname='Fabry65',  
playerID='G:274138044',`language`='it_IT', app='In Arrivo HD'

要重复的关键恰好是令牌,我有错误:

  

重复录入   ' 605a383a7e3469a3da0b471cd5b73af7384ca5e389eeb7cd72e550e96f37f450'对于   密钥'令牌'

如果是另外两个要重复的键,那么当然会发生同样的情况。在DUPLICATE KEY UPDATE上链接似乎不起作用。我怎么能这样做?

简而言之,我的问题是如果三个键中的任何一个相同,则更新一行,如果所有这些键都不同,则插入一个新行。

2 个答案:

答案 0 :(得分:0)

嗯,我认为你误解了选项ON DUPLICATE KEY。如果找到重复的密钥,你不确定会发生什么。

以下是MySQL Docs中的一个示例。

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;

这意味着,如果找到重复的密钥,c应该增加1(c=c+1)。

在您的情况下,您刚刚定义了是否找到重复键,将其设置为特定值。这不是你的意图,不是吗?

也许您只想生成一个新的唯一标识符并使​​用该值更新列?像这样的东西:

INSERT INTO users (udid, nickname, playerID, `language`, app, token,
 `In Arrivo HD`) VALUES ('AB71C145-2FFE-4BA8-B0E7-9F121948C962', 'Fabry65', 'G:274138044', 'it_IT', 'In Arrivo HD', 
'605a383a7e3469a3da0b471cd5b73af7384ca5e389eeb7cd72e550e96f37f450', NOW()+ INTERVAL 1 YEAR) 
ON DUPLICATE KEY UPDATE udid=uuid() -- which will generate a new Unique identifier for those column instead

答案 1 :(得分:0)

好的,我想我找到了一个解决方案:

$query = "UPDATE users SET token='token', udid='$udid', lastAccess=NOW(), active=1, nickname='".$nickname."', playerID='".$playerID."',`language`='".$language."', app='".$app."' WHERE userId=$userId";
    $resultUpdate=$mysqli->query($query);
    if (!$resultUpdate){
        $query = "UPDATE users SET udid='$udid', lastAccess=NOW(), active=1, nickname='".$nickname."', playerID='".$playerID."',`language`='".$language."', app='".$app."' WHERE userId=$userId"
    }

我执行第一个尝试同时更新令牌的查询,如果失败,则表示令牌相同,所以我在不提及令牌的情况下进行更新。