我现在正在写一个游戏,我需要把php部分简化为mysql。
现在要更新一个专栏,我可以这样做(用php):
$res = $db->query("
SELECT succeeded
, failed
, prison
FROM users_crime_masteries
WHERE uid = $uid
AND cid = $crimeid
");
if($status == 'succeeded') {
if(!$res->num_rows) {
$db->query("INSERT INTO users_crime_masteries (uid, cid, succeeded) VALUES($uid, $crimeid, 1)");
return 1;
}
else {
$row = $res->fetch_object();
$db->query("UPDATE users_crime_masteries SET succeeded = succeeded + 1 WHERE uid = $uid AND cid = $crimeid");
return $row->succeeded += 1;
}
}
^这是函数的一半,但你明白了。
我基本上只想在mysql中实现的是,如果没有行,插入一个新行 cid
以及 uid
-如果存在行,则更新成功,并返回+1。
我已经浏览了stackoverflow,我基本上理解的是我必须使用 INSERT ... ON DUPLICATE KEY UPDATE
查询。
但我遇到了这样一条评论:mysql table insert if not exist otherwise update
我有一个专栏叫 id
,它是自动递增的,并且是主键。我的问题是,这会引起什么问题吗?
我目前的mysql版本是:5.7.24
还有,为了这个 ON DUPLICATE KEY UPDATE
我一定要做这个吗 uid
以及 cid
有钥匙吗?
更多信息:
将查询更改为:
switch($status) {
case 'succeeded' :
$db->query("INSERT INTO users_crime_masteries (uid, cid, succeeded) VALUES($userid, $crimeid, 1) ON DUPLICATE KEY UPDATE succeeded = succeeded + 1");
break;
case 'failed' :
$db->query("INSERT INTO users_crime_masteries (uid, cid, failed) VALUES($userid, $crimeid, 1) ON DUPLICATE KEY UPDATE failed = failed + 1");
break;
case 'prison' :
$db->query("INSERT INTO users_crime_masteries (uid, cid, failed, prison) VALUES($userid, $crimeid, 1, 1) ON DUPLICATE KEY update failed = failed + 1, prison = prison + 1");
break;
}
运行了以下mysql查询:
ALTER TABLE `users_crime_masteries`
ADD UNIQUE KEY `uid` (`uid`),
ADD UNIQUE KEY `cid` (`cid`),
用不同的方法犯了几宗罪 cid
,通过phpmyadmin检查,但只有一行,正在更新succeeded字段。
我错过什么了吗?
1条答案
按热度按时间c6ubokkw1#
如果在表中添加唯一键(uid,cid),那么
ON DUPLICATE KEY UPDATE
应该有用。你的id
列不会受到影响或导致问题。此外,您还应该注意您的代码不容易被sql注入,看起来可能是这样。