【问题标题】:UPON DUPLICATE KEY increment multiple columns?UPON DUPLICATE KEY 增加多列?
【发布时间】:2012-03-06 19:27:32
【问题描述】:

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

【问题讨论】:

    标签: mysql increment on-duplicate-key


    【解决方案1】:

    只要去掉 WHERE 子句:

    INSERT INTO `log` (`date`,`hits`,`stale`)
    VALUES ('2012-03-06',1,1)   
    ON DUPLICATE KEY
    UPDATE `hits`=`hits`+1,`stale`=`stale`+1;
    

    【讨论】:

      【解决方案2】:

      你的分隔符是正确的,但是 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.

      【讨论】:

      • 谢谢!不知何故,我认为它只使用一个增量而不是第二个增量,但是我想我在行中添加了 WHERE 子句...
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

        如果存在重复键,INSERT 将静默失败。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-08-09
          • 2019-05-21
          • 2018-01-17
          • 1970-01-01
          • 1970-01-01
          • 2016-11-15
          • 1970-01-01
          相关资源
          最近更新 更多