0

我正在运行数据库日志,并且每天我都会登录一个新行。因此,我的 Mysql 查询会检查日期(日期(唯一键))是否已经存在,如果存在,它会尝试将日志行的所有可记录值加一。如果日期记录还没有出现,它将创建一个新行。

我的 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之间使用哪个分隔符?

4

4 回答 4

1

只需摆脱 WHERE 子句:

INSERT INTO `log` (`date`,`hits`,`stale`)
VALUES ('2012-03-06',1,1)   
ON DUPLICATE KEY
UPDATE `hits`=`hits`+1,`stale`=`stale`+1;
于 2012-03-06T19:31:07.447 回答
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

演示在这里

于 2012-03-06T19:35:25.583 回答
0

你不应该有这个WHERE条款。ON DUPLICATE KEY UPDATE自动将其影响的行限制为具有现有键的行。

删除它,您的查询应该可以正常工作。

于 2012-03-06T19:32:04.030 回答
0

如果您只想在某些特定表达式为真时进行更新,您可以使用两个语句来完成:

INSERT IGNORE INTO x VALUES (.....);
UPDATE x SET ..... WHERE .....;

INSERT如果有重复的密钥,它将默默地失败。

于 2012-03-06T22:00:18.520 回答