Es ist nicht wirklich eine Frage, ich habe die Antwort schon auf die harte Tour herausgefunden. Das Problem ist mit der folgenden Abfrage.MySQL mit "-" als unterschiedlich
delete from <table> where id - 145;
Mit minus statt gleich deutlich ein Tippfehler war. Die Autocommit der Datenbank wurde eingeschaltet und ich löschte alle Einträge in der Tabelle bis auf diejenigen mit der ID = 145. So wirkte das Minus dort als "ungleich" Operator.
Ich suchte nach ähnlichen Situationen und suchte nach diesem Operator in der MySQL-Dokumentation und konnte nichts finden.
Soll das so geschehen? Ist das normal oder ein MySQL-Bug?
Dies bedeutet, dass es lief 'löschen von
Weil 145-145 = 0 und 0 ist FALSE –
Oooh, ja. Es macht jetzt Sinn. Vielen Dank. –
Das ist normal, irgendwie.
id - 145
wertet einen Wert ungleich Null aus, wenn die ID nicht 145 ist und ungleich Null in einem booleschen Kontext wie die WHERE-Klausel als wahr ausgewertet wird.Quelle
2017-06-07 09:43:15 Adder
versuchen
select * from mytable where 3;
Grundsätzlich kann jeder Nicht-Null-Wert zu
true
äquivalent sein wird. Dies ist auch in vielen Sprachen der Fall: Ich bin zuerst auf dieses Verhalten in der SpracheC
vor vielen Jahren gestoßen, während ich an dem Wunder vonwhile (*p++ = *q++);
raste, das zum Kopieren von Zeichenketten verwendet wird.Quelle
2017-06-07 09:46:25
Dies ist perfekt wie erwartet.
Betrachten Sie die folgenden Abfragen:
Wenn Sie diese folgen, können Sie verstehen, dass eine beliebige Anzahl nicht 0 ist truthy betrachtet. Und 0 gilt als falsch. So auch:
All diese Fragen werden alles in der Tabelle löschen.
Jetzt in Ihrer Abfrage haben Sie getan
id - 145
. Dies wird für jede Zeile einer nicht-Null zurück, mit Ausnahme der Zeile mit der ID 145, nur weil 145 - 145 = 0.Deshalb alles außer der Reihe mit der ID gelöscht wurde 145.
Quelle
2017-06-07 09:48:47
Mehr oder weniger. Es funktioniert nicht gleich für Strings.
Der Inhalt der
WHERE
Klausel ist eine Bedingung.Da die documentation ofDELETE
erläutert:Die verlinkte Seite sagt:
id - 145
ist ein gültiger numerischer Ausdruck. Es wertet verschiedene (ganze) Zahlen aus.Wenn es als
WHERE
Bedingung verwendet wird, wird sein Wert inboolean
konvertiert.Der Abschnitt 12.3.3 Logical Operators sagt:
Für alle Reihen
id != 145
, wobei der Ausdruckid - 145
wird auf eine von Null verschiedene, nichtNULL
ganze Zahl ausgewertet, die alsTRUE
in logischen Kontext (in einemWHERE
Zustand fe)Zur Beantwortung Ihrer Frage behandelt wird: Ja, so soll es sein. Es ist kein MySQL-Bug, es ist ein Fehler in Ihrer Abfrage (oder ein Tippfehler, wenn Sie es mehr auf diese Weise mögen).
Quelle
2017-06-07 09:52:06 axiac
Es war ein Tippfehler. Ich wollte schreiben "where id = 145". Vielen Dank. –
Verwandte Themen