使用 INSERT … ON DUPLICATE KEY UPDATE 和几个键
Using INSERT … ON DUPLICATE KEY UPDATE with several keys
我有一个数据库,其中我想要三个键(userId、udid 和令牌)中的一个来标识行:所有三个键都是唯一键,第一个也是主键和自动增量键。基本上我想在其中一个键相同时更新所有值。不幸的是,如果我使用:
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'
而要重复的key恰好是token,我报错:
Duplicate entry
'605a383a7e3469a3da0b471cd5b73af7384ca5e389eeb7cd72e550e96f37f450' for
key 'token'
如果是要重复的另外两个键,当然也会发生同样的情况。链接 DUPLICATE KEY UPDATE's 似乎不起作用。我该怎么做?
简而言之,我的问题是如果三个键中的任何一个相同则更新一行,如果所有键都不同则插入一个新行。
嗯,我认为你误解了选项 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
好的,我想我找到了解决办法:
$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"
}
我执行了第一个查询,尝试同时更新令牌,如果失败,则意味着令牌是相同的,所以我更新时没有提及令牌。
我有一个数据库,其中我想要三个键(userId、udid 和令牌)中的一个来标识行:所有三个键都是唯一键,第一个也是主键和自动增量键。基本上我想在其中一个键相同时更新所有值。不幸的是,如果我使用:
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'
而要重复的key恰好是token,我报错:
Duplicate entry '605a383a7e3469a3da0b471cd5b73af7384ca5e389eeb7cd72e550e96f37f450' for key 'token'
如果是要重复的另外两个键,当然也会发生同样的情况。链接 DUPLICATE KEY UPDATE's 似乎不起作用。我该怎么做?
简而言之,我的问题是如果三个键中的任何一个相同则更新一行,如果所有键都不同则插入一个新行。
嗯,我认为你误解了选项 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
好的,我想我找到了解决办法:
$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"
}
我执行了第一个查询,尝试同时更新令牌,如果失败,则意味着令牌是相同的,所以我更新时没有提及令牌。