2016-05-09 10 views
0

Die folgende scheint Chancen zu mir:ON DUPLICATE KEY UPDATE - Dekrementwert in MySQL

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

Angenommen Ihr NUMERICVALUE ist bei 0.

Die oben auf 100 ändern würde - was funktioniert.

Wenn Sie dann jedoch -100 eingeben, funktioniert es nicht richtig.

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

Die obige Aussage sollte es auf 0 zurückgeben. In meinem Fall nicht. Es bleibt bei 100.

Fehle ich etwas?

Edit: Das geht woanders schief. Ich mache das mit PHP. Der eigentliche Code mit diesem Fehler sieht folgendermaßen aus:

Edit 2: Dies hatte auch nichts mit PHP zu tun. Das Problem war, dass der NUMERIC-Wert in meiner Produktionsumgebung UNSIGNED war, was bedeutet, dass VALUES (NUMERICVALUE) vor der Verwendung von -100 auf 0 gebracht wurde.

Antwort

1

Auf meinem MySQL-Server (5.7.12), funktioniert es wie erwartet:

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) 

Welche Version von MySQL verwenden Sie? Können Sie die obigen exakten Anweisungen ausführen und sehen, ob Sie andere Ergebnisse haben?

+0

Ich habe gerade versucht SQLFiddel und meine eigene 5.7 DB. Sie haben Recht - es hat wie erwartet getan. Ich mache das mit PHP und das geht natürlich woanders schief. Ich werde versuchen, weiter zu untersuchen. – nickdnk

+0

Gut, versuchen Sie einfach, das Problem Schritt für Schritt zu isolieren :) – Benjamin

+0

Siehe aktualisierte Antwort mit PHP-Beispiel. – nickdnk

0

Während Benjamins Antwort richtig ist, stellte sich heraus, dass die NUMERICVALUE-Spalte UNSIGNED war, also immer, wenn ich -100 eingab, wurde sie in 0 umgewandelt, bevor sie als VALUES (NUMERICVALUE) ausgewertet wurde. Wenn das als Fehler zu betrachten ist oder nicht, weiß ich nicht.

Offensichtlich sollte das Ergebnis der abschließenden Auswertung nicht negativ sein, aber ich weiß nicht, wie schlau es ist, es still in 0 zu verwandeln. Ich hatte Logik, die sicherstellt, dass der fragliche Wert sowieso nie unter 0 liegt indem Sie niemals einen negativen Wert überschreiten, der größer ist als der, der bereits in der Reihe war.

Verwandte Themen