2016-05-09 8 views
0

Ниже кажется фору мне:ON KEY UPDATE DUPLICATE - значение декремента в MySQL

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 до его использования.

ответ

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 вы используете? Можете ли вы выполнить точные высказывания выше и посмотреть, есть ли у вас разные результаты?

+0

Я просто попробовал SQLFiddel и свою собственную 5.7 DB. Вы правы - все было так, как ожидалось. Я делаю это через PHP, и, очевидно, это происходит неправильно в другом месте. Я попытаюсь продолжить исследование. – nickdnk

+0

Хорошо, просто постарайтесь изолировать проблему на один шаг за раз :) – Benjamin

+0

См. Обновленный ответ с примером PHP. – nickdnk

0

В то время как ответ Бенджамина верен, корень проблемы оказался фактом, что столбец NUMERICVALUE был UNSIGNED, поэтому всякий раз, когда я вводил -100, он был превращен в 0, прежде чем он был оценен как VALUES (NUMERICVALUE). Если это нужно считать ошибкой или нет, я не знаю.

Очевидно, результат окончательной оценки не должен быть отрицательным, но я не знаю, насколько умным это превратить его в 0. Я имел логику на месте, убедившись, что значение, о котором идет речь, никогда не будет ниже 0 никогда не передавая отрицательное значение больше, чем то, что уже было в строке.