2011-05-27 577 views

回答

110

你可以这样做

DELETE FROM table WHERE id NOT IN (2) 

OR

DELETE FROM table WHERE id <> 2 

由于@Frank Schmitt指出,你可能也要小心NULL值。如果要删除不是2(包括NULL)的所有内容,请将OR id IS NULL添加到WHERE子句中。

+0

我尝试了这个命令几次..但它似乎并没有工作,直到我意识到DELETE在MySQL中不使用* .. – 2011-05-27 19:59:48

+1

但没有*它很好地工作。谢谢 – 2011-05-27 20:00:09

+0

你走了,编辑答案删除*谢谢指出。 – Lobo 2011-05-27 21:45:33

12
delete from table where id <> 2 



编辑:以正确的语法为MySQL

6

使用<>否定where子句。

6

你可以做到以下几点:

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

如果该值不是数字,则工作良好WHERE NOT(id ='two'); – Kareem 2015-10-11 20:23:11

5

WHERE id <> 2应该正常工作......这是你所追求的?

3

是的。如果记忆为我服务,那应该起作用。 我们可以使用:

DELETE FROM table WHERE id <> 2 
5

回顾形式逻辑和代数。像

A & B & (D | E) 

的表达可以用几种方式来否定:

  • 最显而易见的方法:

    !(A & B & (D | E)) 
    
  • 以上也可以重申,你只需要记住逻辑表达式的一些属性:

    • !(A & B)相当于(!A | !B)
    • !(A | B)相当于(!A & !B)
    • !(!A)相当于(A)。

    分发不能跨越其适用的整个表达式,反相 运营商和消除双重否定,你走(!):

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

因此,在一般情况下,任何地方条款可以根据上述规则否定。这

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

的否定是

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

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

哪个更好?这是一个非常敏感的问题。只有你可以决定。

但请注意,使用NOT会影响优化器可以或不可以执行的操作。您可能会得到不太理想的查询计划。

23

你的问题已经被其他海报说,我只是想指出,

delete from table where id <> 2 

(或其变体,而不是ID = 2等)将不会其中id为NULL删除行。

如果你也想使用id = NULL来删除行:

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

+1为了捕捉我们其他人没有的东西:) – JNK 2011-05-27 20:18:27

+0

很好的抓住弗兰克。 – Lobo 2011-05-27 21:51:50

0

我只是解决了这个问题。如果您使用<>或者不在变量上,则为空,则会导致错误。因此,而不是<> 1,你必须检查它像这样:

AND (isdelete is NULL or isdelete = 0)