以下似乎对我很不利:
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。
答案 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永远不会传递一个大于行中已有的负值。