ON DUPLICATE KEY UPDATE - MySQL中的递减值

时间:2016-05-09 22:49:20

标签: mysql increment decrement on-duplicate-key

以下似乎对我很不利:

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。

2 个答案:

答案 0 :(得分:1)

在我的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?你能执行上面的确切陈述,看看你是否有不同的结果?

答案 1 :(得分:0)

虽然Benjamin的答案是正确的,但问题的根源是NUMERICVALUE列是UNSIGNED的事实,因此每当我输入-100时,它在被评估为VALUES(NUMERICVALUE)之前变为0。如果这被认为是一个错误,我不知道。

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