UPON DUPLICATE KEY增加多列?

时间:2012-03-06 19:27:33

标签: mysql increment on-duplicate-key

我正在运行数据库日志,每天我都会登录一个新行。因此,我的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 之间使用逗号以外的其他分隔符?

4 个答案:

答案 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将无声地失败。