我有一个数据库,我希望使用三个键(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似乎不起作用。我该怎么办?

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

最佳答案

好吧,我认为您误解了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

关于php - 使用INSERT…ON重复键更新与几个键,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31088288/

10-11 03:39
查看更多