2017-08-24 8 views
0

Ich habe Probleme, diese einfache Abfrage funktioniert:Unsigned Feld Maximalwert aktualisiert

INSERT INTO stock 
(articles_id, date, in, out) 
VALUES 
(106, '2017-08-24', 0, 4) 
ON DUPLICATE KEY UPDATE out = IF(out - 4 >= 0, out - 4, 0) 

Dies ist die Struktur der Bestandstabelle:

CREATE TABLE IF NOT EXISTS `stock` (
    `articles_id` mediumint(8) unsigned NOT NULL, 
    `date` date NOT NULL, 
    `in` mediumint(8) unsigned NOT NULL COMMENT 'new units in date', 
    `out` mediumint(8) unsigned NOT NULL COMMENT 'no. of units sold in date' 
    PRIMARY KEY (`articles_id`,`date`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

Die abgefragten Datensatz bereits vorhanden ist, und hat diese Werte:

  1. articles_id: 106
  2. Datum: 2017.08.02 4
  3. in: 0
  4. aus: 2

Nachdem die Abfrage ausgeführt wird, aus hat einen Wert von , die ich denke, da dieses Feld unsigned (Ich will es so), wenn ich einen größeren Wert subtrahiere als das Original, beginnt es von seinem Maximalwert herunter zu zählen.

Allerdings sollte nicht meine IF Anweisung dieses Verhalten verhindern ??

Antwort

2

Sie müssen die eingehenden Werte verwenden, so verwenden values():

INSERT INTO stock(articles_id, date, in, out) 
    VALUES (106, '2017-08-24', 0, 4) 
    ON DUPLICATE KEY UPDATE out = (CASE WHEN VALUES(out) - 4 >= 0 
             THEN VALUES(out) - 4 
             ELSE 0 
            END); 
+1

Also ich denke, (out - 4) wird ihr Wert nicht nehmen, aber es arbeitet auf dem Feld selbst, so dass dieser Wert immer : 16777215, da es größer als 0 ist, tritt es in die erste Bedingung ein und macht schließlich die Subtraktion. – user3514092