2010-07-08 13 views

risposta

37

Questo non eliminerà nulla dalla tabella. NULL non è uguale a NULL.

Ora

eliminare dal tavolo dove NULL è NULL

sarebbe eliminare tutte le righe della tabella.

+8

+1 per NULL! = NULL. Un po 'più di spiegazione, visto che mi piace questa distinzione. In termini di database, NULL può significare una mancanza di informazioni - cioè non fornite, per qualsiasi motivo - o informazioni sconosciute, ma non si sa quale. Pertanto, non esistono due NULL uguali. –

+3

Destra e anche due NULL non sono identici. Se non conosci i valori, non puoi dire con certezza se sono uguali o se sono diversi. Quindi qualsiasi confronto produce * sconosciuto * che non è * falso * ma non è sicuramente * vero * neanche. –

+5

+1 Ma con un avvertimento. È così solo in SQL standard e non tutti gli RDBMS forniscono lo stesso dialetto standard di SQL. Non l'ho postato come risposta, perché la domanda è marcata _mysql_, ma in MS SQL Server se prima emetti 'set ansi_nulls off' quindi' cancella dalla tabella quando null = null' cancellerà tutte le righe perché con questo switch ' null = null' diventa vero. –

2

Immagino che dipenda dal database, ma per quanto ne so, non dovrebbe ottenere nulla, dato che NULL non è mai uguale a NULL, almeno nella teoria di db.

3

Poiché NULL non è uguale a NULL, questa istruzione non farà nulla. È uguale a:

DELETE FROM TABLE WHERE 0 
16

Significa non eliminare nulla, perché NULL non è mai uguale a nulla. O forse significa "non cancellare nulla a meno che il DBMS dell'utente non faccia davvero schifo, nel qual caso cancella tutto per dispetto". Seriamente, questo tipo di costrutto di solito avviene quando una clausola WHERE viene generata in modo procedurale - piuttosto che creare un caso speciale per "non fare nulla", a volte è più semplice generare una clausola WHERE che fa sì che il database faccia Niente. Di solito ho visto "WHERE 0 = 1", che è meno ambiguo.

+0

+1 per indovinare la query generata - che è stata la prima cosa che mi è venuta in mente quando ho letto la domanda. –

8

In SQL, ci sono tre valori logici, vale a dire VERO, FALSO e SCONOSCIUTO. quando confrontiamo null a null, usando null = null, l'operazione restituirà UNKNOWN. Inoltre, nella clausola WHERE vengono filtrati tutti i valori di UNKNOWN. Quindi la query non fa nulla.

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) 

Significato, se una condizione viene valutata a null è considerato falso da MySQL in modo delete from table where NULL = NULL sarà in realtà cancellare nulla.

NULL è un animale speciale come notato da Codd

+1

non è un po 'di confusione affermare che null è considerato falso (poiché NOT null dovrebbe quindi essere vero, che non è il caso)? – potatopeelings

+0

sì è confuso, ma sto parlando specificatamente delle condizioni qui. ma l'intera nullità è super confusa. –

+0

null non è considerato falso, ma non è considerato vero. DOVE controlla se l'espressione è vera. –

-2

Non una singola riga è influenzata da questo comando SQL.

5

Punisce le persone che hanno ANSI_NULLS disattivato nel proprio database :)