2016-05-09 185 views
0

遞減值下似乎賠率對我說:對重複密鑰更新 - 在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數據庫。你是對的 - 它按預期做到了。我通過PHP來做這件事,顯然這在其他地方是錯誤的。我會嘗試進一步調查。 – nickdnk

+0

好,只要一次嘗試隔離問題一步:) – Benjamin

+0

查看PHP示例更新的答案。 – nickdnk

0

雖然Benjamin的回答是正確的,但問題的根源竟然是NUMERICVALUE列是UNSIGNED,所以無論何時輸入-100,在它被評估爲VALUES(NUMERICVALUE)之前,它都變爲0。如果這被認爲是一個錯誤,我不知道。

顯然,最終評估的結果不應該是負面的,但我不知道它是多麼聰明,它默默地把它變成0.我有邏輯,確保有問題的價值永遠不會低於0通過從不傳遞大於已經在行中的負值。