mySQL: IF im UPDATE? | Warning: #1292

WulfmanGER

Commander
Registriert
Juli 2005
Beiträge
2.225
Hallo in die Runde,

ich habe ein INSERT mit ON DUPLICATE KEY UPDATE. Das ganze klappt (zumindest noch keinen Fehler gesehen), wirft mir aber in phpMyAdmin: "Warning: #1292 Falscher DOUBLE-Wert gekürzt: '' " raus. Ist also irgendwie noch nicht sauber

... der Übeltäter ist identifiziert nur wie ich das losbekomme bzw. besser mache weiß ich nicht

Code:
INSERT INTO [...]
ON DUPLICATE KEY UPDATE 
awd_gg = IF(awd_gg < '' OR awd_gg IS NULL, NULLIF('',''), awd_gg),
[...]

Die Zeile awd_gg (int(2)) verursacht die Warnung. Davon hab ich 4 und somit 4 Warnings ;)

Hier mal der mit der Variablen in PHP - vielleicht wird dann etwas klarer was ich will? ;)
Code:
awd_gg = IF(awd_gg < '$awd_gg' OR awd_gg IS NULL, NULLIF('$awd_gg',''), awd_gg),

awd_gg enthält per Default "NULL" - Nur wenn $awd_gg einen Wert enthält der höher als das Feld awd_gg ist, darf der neue Wert reingeschrieben werden - ansonsten bleibt es bei NULL.

Wie gesagt - das funktioniert - bis auf die Warnings. Der Syntax ist ja vom Grundsatz richtig - sonst würde es nicht funktionieren und eine Fehlermeldung rauswerfen.

Wie bekomme ich das nun hin? U.a. sagt Warning 1292 aus das ich im UPDATE die SETs nicht mit AND verknüpfen darf - aber das mach ich ja schon nicht. Ansonsten sollte man im UPDATE test='1' machen und nicht test=1 ...
 
awd_gg ist int?
Dann vergleichst du hier in deinem IF vielleicht gegen ein Double oder einen String? Das könnte es sein.
Zweite Möglichkeit: Du insertest hier mehrere spalten oder machst mehrere Dinge im "On Duplicate" und hast die durch ein AND statt durch ein Komma verknüpft?
 
Mir ist das mit dem String ja suspekt, aber abgesehen davon würde ich nicht erwarten, daß "awd_gg < irgendwas" einen gültigen Wert liefert, wenn awd_gg an der Stelle NULL ist.

Dann lieber coalesce(awd_gg, <arbiträre zahl>) < $awd_gg .
Wobei mir die Variable da auch nicht gefällt. Kann mysql immer noch kein Parameter Binding? 🤔

Mir schwebt sowas in der Art vor:
SQL:
insert into table (awd_gg) values ( 10)
on duplicate key update
awd_gg = if(coalesce(awd_gg, -1) < :awd_gg_new, :awd_gg_new, awd_gg)

und dann die Frage, ob der neue Wert numerisch ist, über PDO sicher stellen.
Denn wenn da nichts Numerisches drinsteht, dann ist der neue Wert ganz offensichtlich nicht "größer" als der alte.

Ich hab als Ersatzwert für NULL hier -1 angenommen. Das funktioniert natürlich nur, wenn die Eingabewerte nach unten beschränkt sind; dann kann man seinen Ersatzwert noch eins weiter drunter ansetzen. Ansonsten riskiert man, daß awd_gg nie aktualisiert wird, weil zB 0 reingeschrieben werden soll und aber coalesce(awd_gg,0) offensichtlich nicht < 0 ist.
 
Zurück
Oben