2017-06-07 2 views
1

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?

Antwort

3
delete from <table> where id - 145; 

fein funktioniert, wenn id146 als 146-145=1 und mysql return true für 1 und falsch ist für 0;

Hoffe das lösen Sie Ihre Zweifel.

+0

Dies bedeutet, dass es lief 'löschen von

wo wahr;' und damit alle Werte zu löschen. Warum wurde der Eintrag mit ID = 145 nicht gelöscht? –

+1

Weil 145-145 = 0 und 0 ist FALSE –

+0

Oooh, ja. Es macht jetzt Sinn. Vielen Dank. –

2

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.

0

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 Sprache C vor vielen Jahren gestoßen, während ich an dem Wunder von

while (*p++ = *q++); raste, das zum Kopieren von Zeichenketten verwendet wird.

3

Dies ist perfekt wie erwartet.

Betrachten Sie die folgenden Abfragen:

delete from <table>; 
delete from <table> where true; 
delete from <table> where 1; 

Wenn Sie diese folgen, können Sie verstehen, dass eine beliebige Anzahl nicht 0 ist truthy betrachtet. Und 0 gilt als falsch. So auch:

delete from <table> where 3; 
delete from <table> where 50; 
delete from <table> where -1; 

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.

2

das Minus dort diene als "ungleicher" Operator.

Mehr oder weniger. Es funktioniert nicht gleich für Strings.

Der Inhalt der WHERE Klausel ist eine Bedingung.Da die documentation of DELETE erläutert:

where_condition ein Ausdruck ist, der für jede Zeile den Wert true zu löschen. Es wird wie in Section 13.2.9, "SELECT Syntax" beschrieben angegeben.

Die verlinkte Seite sagt:

Im WHERE Ausdruck Sie eine der Funktionen und Operatoren verwenden können, die MySQL, mit Ausnahme Aggregat (Zusammenfassung) Funktionen unterstützt. Siehe und Chapter 12, Functions and Operators.

id - 145 ist ein gültiger numerischer Ausdruck. Es wertet verschiedene (ganze) Zahlen aus.
Wenn es als WHERE Bedingung verwendet wird, wird sein Wert in boolean konvertiert.

Der Abschnitt 12.3.3 Logical Operators sagt:

MySQL jeden von Null verschiedenen, nicht NULL Wert TRUE auswertet.

Für alle Reihen id != 145, wobei der Ausdruck id - 145 wird auf eine von Null verschiedene, nicht NULL ganze Zahl ausgewertet, die als TRUE in logischen Kontext (in einem WHERE 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).

+0

Es war ein Tippfehler. Ich wollte schreiben "where id = 145". Vielen Dank. –

Verwandte Themen