我正在运行数据库日志,每天我都会登录一个新行。因此,我的Mysql查询检查日期(日期(唯一键))是否已经存在,如果存在,它会尝试将日志行的所有可记录值递增1。如果日期记录还没有出现,它将创建一个新行。
我的SQL查询是:
INSERT INTO `log` (`date`,`hits`,`stale`)
VALUES ('2012-03-06',1,1)
ON DUPLICATE KEY
UPDATE `hits`=`hits`+1,`stale`=`stale`+1
WHERE `date`='2012-03-06';"
所有列都有0作为默认值,因此如果此查询在午夜后直接运行,则只将'stale'和'hits'设置为1.否则'stale'和'hits'都会递增。
我希望! (它不起作用。)
我错过了什么?我应该在'hits'='hits'+ 1 和'stale'='stale'+ 1 之间使用逗号以外的其他分隔符?
答案 0 :(得分:1)
摆脱WHERE子句:
INSERT INTO `log` (`date`,`hits`,`stale`)
VALUES ('2012-03-06',1,1)
ON DUPLICATE KEY
UPDATE `hits`=`hits`+1,`stale`=`stale`+1;
答案 1 :(得分:1)
你的分隔符是正确的,但是UPDATE已经找到了重复行以便能够触发ON DUPLICATE KEY,所以你不需要尝试使用WHERE再次选择它。
INSERT INTO `log` (`date`,`hits`,`stale`)
VALUES ('2012-03-06',1,1)
ON DUPLICATE KEY
UPDATE `hits`=`hits`+1,`stale`=`stale`+1
演示here。
答案 2 :(得分:0)
你不应该有WHERE
条款。 ON DUPLICATE KEY UPDATE
会自动将其影响的行限制为具有现有密钥的行。
删除它,您的查询应该可以正常工作。
答案 3 :(得分:0)
如果您只想在某些特定表达式为真时进行更新,则可以使用两个语句来执行此更新:
INSERT IGNORE INTO x VALUES (.....);
UPDATE x SET ..... WHERE .....;
如果存在重复的密钥,INSERT
将无声地失败。