Ich habe eine Tabelle mit einer Spalte unsigned int
, nennen wir sie col1.
Ich möchte die Spalte um eine Zahl dekrementieren. Wenn der Wert nach dem Dekrementieren kleiner als 1 ist, setzen Sie ihn auf 1. So:
UPDATE `tbl1` SET `col1` = GREATEST(1, `col1`-3);
Dies funktioniert gut, aber wenn col1 0 oder 1 oder 2 ist und ich versuche, -3 zu tun, gibt MySQL einen Fehler aus.
UNSIGNED
?UNSIGNED
es keine negativen Werte zulässt.Antworten:
Sie können eine
case
Klausel verwendenWie @RDFozz beschrieben:
Mit dem im OP aufgelisteten Code muss col1 - 3 berechnet werden, und da es sich um eine vorzeichenlose Ganzzahl handelt, muss das Ergebnis eine vorzeichenlose Ganzzahl sein. Dieser Code verhindert, dass die Berechnung durchgeführt wird, es sei denn, das Ergebnis wäre tatsächlich eine Ganzzahl ohne Vorzeichen.
UPDATE:
Ein anderer möglicher Weg, wie von @kondybas vorgeschlagen
quelle
col1 - 3
muss berechnet werden, und da es sich um eine vorzeichenlose Ganzzahl handelt, muss das Ergebnis eine vorzeichenlose Ganzzahl sein. Ihr alternativer Code verhindert, dass die Berechnung durchgeführt wird, es sei denn, das Ergebnis wäre tatsächlich eine Ganzzahl ohne Vorzeichen.IF()
Funktion:SET col1 = IF(col1<3, 1, col1-3)
..if value after decrement is less than 1 then set it to 1.
, habe ich<= 3
statt< 3
Fügen Sie einfach eine
WHERE
Erklärung hinzuquelle
- 1
eine variable Zahl, es kann eine beliebige Zahl sein (-1, -2, -3 usw.). Wie geht das?UPDATE tbl1 SET col1 = col1 - $var WHERE col1 >= $var + 1;
UPDATE tbl1 SET col1 = col1 - 3 WHERE col1 >= 4;
folgt zu machen: dann bleibt col1 als 2, anstatt auf 1 aktualisiert zu werdenNoch eine andere Art, diese Katze zu häuten:
Möglicherweise effizienter:
quelle
Der Mindestwert, den eine
unsigned int
Dose haben kann, ist 0. Sie können sie nur dann auf negativ setzen, wenn sie signiert ist. Sie müssen Logik implementieren, um die Werte in der Spalte zu verarbeiten, damit SieGREATEST(1, 'col1'-3)
nicht gegen die Regel verstoßen.CASE WHEN
in dieser Anweisung kann genauso gut funktionieren wie das Herausziehen einer gefilterten Teilmenge der Daten mit einer Unterabfrage.MySQL-Referenz
Stapelüberlaufreferenz
Sie können Ihr vorzeichenloses int auch als signiertes int umwandeln und dann die Arithmetik ausführen.
Stapelüberlaufreferenz beim Gießen auf signiert
quelle