【问题标题】:ON DUPLICATE KEY UPDATE - decrement value in MySQLON DUPLICATE KEY UPDATE - MySQL 中的递减值
【发布时间】:2016-09-04 17:32:03
【问题描述】:

以下对我来说似乎很奇怪:

INSERT INTO sometable (UNIQUEVALUE,NUMERICVALUE) VALUES ('valuethatexists','100') ON DUPLICATE KEY UPDATE NUMERICVALUE = NUMERICVALUE+VALUES(NUMERICVALUE);

假设您的 NUMERICVALUE 为 0。

上面会将其更改为 100 - 这确实有效。

但是,如果您随后输入 -100,则无法正常工作。

INSERT INTO sometable (UNIQUEVALUE,NUMERICVALUE) VALUES ('valuethatexists','-100') ON DUPLICATE KEY UPDATE NUMERICVALUE = NUMERICVALUE+VALUES(NUMERICVALUE);

上面的语句应该将它返回到 0。在我的例子中它没有。它保持在 100。

我错过了什么吗?

编辑:这在其他地方出错了。我正在用 PHP 做这个。显示此错误的实际代码如下所示:

编辑 2:这也与 PHP 无关。问题是我的生产环境中的 NUMERIC 值是 UNSIGNED,这意味着 VALUES(NUMERICVALUE) 在使用之前从 -100 变为 0。

【问题讨论】:

    标签: mysql increment decrement on-duplicate-key


    【解决方案1】:

    虽然 Benjamin 的回答是正确的,但问题的根源在于 NUMERICVALUE 列是 UNSIGNED,所以每当我输入 -100 时,它在被评估为 VALUES(NUMERICVALUE) 之前就变成了 0。我不知道这是否被认为是一个错误。

    显然,最终评估的结果不应该是负面的,但我不知道默默地将其变为 0 有多聪明。我有逻辑确保所讨论的值无论如何都不会低于 0永远不要传递大于行中已有值的负值。

    【讨论】:

      【解决方案2】:

      在我的 MySQL 服务器 (5.7.12) 上,它确实按预期工作:

      mysql> CREATE TABLE sometable (
             UNIQUEVALUE VARCHAR(16) NOT NULL PRIMARY KEY, 
             NUMERICVALUE INT NOT NULL);
      Query OK, 0 rows affected (0.01 sec)
      
      mysql> INSERT INTO sometable (UNIQUEVALUE,NUMERICVALUE)
             VALUES ('valuethatexists','100')
             ON DUPLICATE KEY UPDATE NUMERICVALUE = NUMERICVALUE+VALUES(NUMERICVALUE);
      Query OK, 1 row affected (0.01 sec)
      
      mysql> SELECT * FROM sometable;
      +-----------------+--------------+
      | UNIQUEVALUE     | NUMERICVALUE |
      +-----------------+--------------+
      | valuethatexists |          100 |
      +-----------------+--------------+
      1 row in set (0.00 sec)
      
      mysql> INSERT INTO sometable (UNIQUEVALUE,NUMERICVALUE)
             VALUES ('valuethatexists','-100')
             ON DUPLICATE KEY UPDATE NUMERICVALUE = NUMERICVALUE+VALUES(NUMERICVALUE);
      Query OK, 2 rows affected (0.00 sec)
      
      mysql> SELECT * FROM sometable;
      +-----------------+--------------+
      | UNIQUEVALUE     | NUMERICVALUE |
      +-----------------+--------------+
      | valuethatexists |            0 |
      +-----------------+--------------+
      1 row in set (0.00 sec)
      

      您使用的是哪个版本的 MySQL?你能执行上面的确切语句,看看是否有不同的结果吗?

      【讨论】:

      • 我刚刚尝试了 SQLFiddel 和我自己的 5.7 DB。你是对的 - 它按预期进行。我正在通过 PHP 执行此操作,显然这在其他地方出错了。我会尝试进一步调查。
      • 好,试着一步一步地找出问题:)
      • 没关系。我发现了问题。不过感谢您的帮助。
      猜你喜欢
      • 2011-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-29
      • 2018-05-22
      • 2011-08-09
      相关资源
      最近更新 更多