2011-05-27 23 views

Respuesta

110

Puede hacer como esto

DELETE FROM table WHERE id NOT IN (2) 

O

DELETE FROM table WHERE id <> 2 

Como @Frank Schmitt señaló, es posible que desee tener cuidado con los valores NULL también. Si desea eliminar todo lo que no sea 2 (incluidos los NULL), agregue OR id IS NULL a la cláusula WHERE.

+0

He intentado este comando un par de veces ... pero no pareció funcionar hasta que me di cuenta de que ELIMINAR en MySQL no usa el * .. –

+1

Pero sin * funciona muy bien. Gracias –

+0

Ahí va, editó la respuesta para eliminar * Gracias por señalar. – Lobo

12
delete from table where id <> 2 



de edición: para corregir la sintaxis de MySQL

6

Utilice <> para anular la cláusula where.

6

que podría hacer lo siguiente:

DELETE * FROM table WHERE NOT(id = 2); 
+0

Funciona bien si el valor no es numérico DONDE NO (id = 'two'); – Kareem

5

WHERE id <> 2 debería funcionar bien ... ¿Eso es lo que está después?

3

Sí. Si la memoria me sirve, debería funcionar. Nuestra puede usar:

DELETE FROM table WHERE id <> 2 
5

Mirar hacia atrás a la lógica formal y el álgebra. Una expresión como

A & B & (D | E) 

puede ser negado en un par de maneras:

  • La manera obvia:

    !(A & B & (D | E)) 
    
  • Lo anterior también puede ser actualizado, sólo tiene que recordar algunas propiedades de expresiones lógicas:

    • !(A & B) es el equivalente a (!A | !B).
    • !(A | B) es el equivalente a (!A & !B).
    • !(!A) es el equivalente de (A).

    Distribuir el NO a través de toda la expresión a la que se aplica, invirtiendo operadores y la eliminación de dobles negativos a medida que avanza (!):

    !A | !B | (!D & !E) 
    

Así que, en general, en cualquier lugar la cláusula puede ser negada de acuerdo con las reglas anteriores.La negación de esta

select * 
from foo 
where  test-1 
    and  test-2 
    and ( test-3 
     OR test-4 
    ) 

es

select * 
from foo 
where NOT(   test-1 
      and  test-2 
      and ( test-3 
       OR test-4 
       ) 
     ) 

o

select * 
from foo 
where  not test-1 
    OR   not test-2 
    OR ( not test-3 
     and not test-4 
     ) 

¿Qué es mejor? Esa es una pregunta muy sensible al contexto. Solo tú puedes decidir eso.

Tenga en cuenta, sin embargo, que el uso de NOT puede afectar lo que el optimizador puede o no puede hacer. Es posible que obtenga un plan de consulta menos que óptimo.

23

su pregunta ya fue contestada por los otros carteles, sólo me gustaría señalar que

delete from table where id <> 2 

(o variantes de los mismos, no id = 2, etc.) no eliminar filas donde id es NULL.

Si también desea eliminar filas con id = NULL:

delete from table where id <> 2 or id is NULL 
+3

+1 Para atrapar algo ninguno de nosotros lo hicimos :) – JNK

+0

Nice catch Frank. – Lobo

0

Estaba a la solución de este problema. Si usa <> o no está en una variable, eso es nulo, resultará en falso. Así que en lugar de <> 1, debe comprobar de esta manera:

AND (isdelete is NULL or isdelete = 0)