2010-07-08 12 views

Antwort

37

Das wird nichts aus der Tabelle löschen. NULL ist nicht gleich NULL. Jetzt

aus der Tabelle löschen, wo NULL NULL ist

würde löschen Sie alle Zeilen aus der Tabelle.

+8

+1 für NULL! = NULL. Ein bisschen mehr Erklärung, da ich diese Unterscheidung mag. In Datenbankbegriffen kann NULL einen Mangel an Information bedeuten - d. H. Nicht bereitgestellt, aus welchem ​​Grund auch immer - oder unbekannte Information, aber Sie wissen nicht welche. Daher sind keine zwei NULLs gleich. –

+3

Richtig, und zwei NULLs sind auch nicht unalike. Wenn Sie die Werte nicht kennen, können Sie nicht sicher sagen, ob sie gleich sind oder ob sie unterschiedlich sind. Daher ergibt jeder Vergleich * unbekannt *, was nicht * falsch * ist, aber auch nicht * wahr *. –

+5

+1 Aber mit einem Vorbehalt. Es ist so nur in Standard-SQL und nicht alle RDBMS bieten den gleichen Standard-SQL-Dialekt. Ich habe es nicht als Antwort gepostet, weil die Frage _mysql_ getaggt ist, aber in MS SQL Server, wenn Sie zuerst 'ansi_nulls aussetzen' dann 'löschen aus der Tabelle, wenn null = null 'löscht alle Zeilen, weil mit diesem Schalter' null = null wird wahr. –

2

Ich kann mir vorstellen, dass es von der Datenbank abhängt, aber meines Wissens sollte es nichts erreichen, da NULL zumindest in der db-Theorie niemals gleich NULL ist.

3

Da NULL nicht gleich NULL ist, wird diese Anweisung nichts tun. Es entspricht:

DELETE FROM TABLE WHERE 0 
16

Es bedeutet, löschen Sie nichts, weil NULL nie gleich ist. Oder vielleicht bedeutet es "lösche nichts, außer das DBMS des Benutzers ist wirklich nervig, in diesem Fall lösche alles aus Trotz".

Ernsthaft, diese Art von Konstrukt kommt normalerweise zustande, wenn eine WHERE-Klausel prozedural erzeugt wird - anstatt einen Sonderfall für "do nothing" zu erstellen, ist es manchmal einfacher, eine WHERE-Klausel zu generieren, die die Datenbank dazu veranlasst nichts. Normalerweise habe ich "WHERE 0 = 1" gesehen, was weniger eindeutig ist.

+0

+1 für das Erraten der generierten Abfrage - das war das erste, was mir in den Sinn kam, als ich die Frage las. –

8

In SQL gibt es drei logische Werte, nämlich TRUE, FALSE und UNKNOWN. Wenn wir null mit null vergleichen und null = null verwenden, gibt die Operation UNKNOWN zurück. Außerdem werden in der WHERE-Klausel alle UNKNOWN-Werte herausgefiltert. Daher führt die Abfrage nichts aus.

3

Recap:

mysql> select null = null, null <> null, null is null, null = 1, null <> 1; 
+-------------+--------------+--------------+----------+-----------+ 
| null = null | null <> null | null is null | null = 1 | null <> 1 | 
+-------------+--------------+--------------+----------+-----------+ 
|  NULL |   NULL |   1 |  NULL |  NULL | 
+-------------+--------------+--------------+----------+-----------+ 
1 row in set (0.00 sec) 


mysql> select count(*) from table; 
+----------+ 
| count(*) | 
+----------+ 
|  10 | 
+----------+ 
1 row in set (0.33 sec) 


mysql> select * from table where null; 
Empty set (0.00 sec) 

Bedeutung, wenn eine Bedingung auf Null wertet sie durch MySql falsch betrachtet wird, so wird delete from table where NULL = NULL in der Tat nichts löschen.

NULL ist ein besonderes Tier wie bereits von Codd

+1

ist es nicht ein wenig verwirrend zu sagen, dass null als falsch angesehen wird (da dann NULL nicht wahr sein müsste, was nicht der Fall ist)? – potatopeelings

+0

ja es ist verwirrend, aber ich spreche hier speziell über Bedingungen. aber das ganze Null-Ding ist super verwirrend. –

+0

null gilt nicht als falsch, aber es gilt auch nicht als wahr. WHERE prüft, ob Ausdruck als wahr ausgewertet wird. –

-2

Nicht eine einzige Zeile von diesem SQL-Befehl betroffen ist.

5

Es straft Menschen, die in ihrer Datenbank ab ANSI_NULLS gesetzt haben :)