2016-05-09 3 views
0

で減少値は、次の私にオッズを思わ:- MySQLの

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

は、あなたのNUMERICVALUEは、上記の100に変更します0

であると仮定 - 仕事をしています。

ただし、-100を入力すると正しく動作しません。

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

上記の文は、0に戻す必要があります。私の場合はそうではありません。それは100のままです。

私に何かが不足していますか?

編集:これは他の場所で間違っています。私はPHPでこれをやっています。このバグを示す実際のコードは次のようになります。

編集2:これはPHPとは関係ありません。問題は、使用前にVALUES(NUMERICVALUE)が-100から0になったことを意味する、NUMERIC値が私の実稼働環境でUNSIGNEDになっていたことです。私のMySQLサーバ(5.7.12)で

答えて

1

予想通り、それは仕事のことを行います

のMySQLのバージョンを使用している
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) 

?上記の正確なステートメントを実行して、結果が異なるかどうかを確認できますか?

+0

私はSQLFiddelと自分の5.7 DBを試しました。あなたは正しい。それは期待通りだった。私はPHPでこれをやっていますが、明らかにこれはどこかで間違っています。私はさらに調査を試みます。 – nickdnk

+0

良い、ちょうど一度に問題を隔離しようとしてください:) – Benjamin

+0

PHPの例で更新された答えを参照してください。 – nickdnk

0

ベニヤミンの答えは正しいが、NUMERICVALUE列がUNSIGNEDであることが判明したので、-100を入力するたびにVALUES(NUMERICVALUE)として評価される前に0になりました。これがバグと見なされるかどうかわかりません。

明らかに最終評価の結果は負であってはいけませんが、私はそれを静かに0にすることが賢明ではありません。私は、問題の値が決して0以下すでに行内にある値よりも大きな負の値を渡すことはありません。