在MySQL中使用ID从表中删除许多行


73

我是Linux管理员,仅具有Mysql Queries中的基本知识

我想使用id从我的表中删除许多表条目,这些条目是ip地址。

目前我正在使用

DELETE from tablename where id=1;
DELETE from tablename where id=2;

但是我必须删除254个条目,所以此方法将要花费数小时,我如何告诉mysql删除我指定的行,因为我想跳过从这254个条目中删除一些条目。

不能删除整个表并导入所需的条目。


1
id是一个数字,所以类似之类的DELETE from tablename where id<254 and id>3;东西都会起作用。
蜘蛛鲍里斯(Boris)

哦,每个答案都有效....
Kevin Parker

Answers:


183

最好的方法是使用IN语句:

DELETE from tablename WHERE id IN (1,2,3,...,254);

BETWEEN如果您有连续的ID,也可以使用:

DELETE from tablename WHERE id BETWEEN 1 AND 254;

您当然可以使用其他WHERE子句来限制某些ID:

DELETE from tablename WHERE id BETWEEN 1 AND 254 AND id<>10;

正如我们今天在应用程序中发现的那样,范围(><)比IN性能要好。使用说明语句,查看如何IN不使用索引。
kouton 2014年

1
不必担心您的DBMS如何使用INDEX ...请参阅stackoverflow.com/questions/586381/…了解为什么有时使用INDEX的时间比进行全表扫描的时间更长!
JoDev

谢谢您的帮助
Jean-Marc Amon

8

怎么样使用 IN

DELETE FROM tableName
WHERE ID IN (1,2) -- add as many ID as you want.

6

如果只需要保留几行,请考虑

DELETE FROM tablename WHERE id NOT IN (5,124,221);

这将仅保留一些记录,而丢弃其他记录。


5

这样的事情可能会使它变得容易一些,您显然可以使用脚本来生成它,甚至可以

DELETE FROM tablename WHERE id IN (
1,
2,
3,
4,
5,
6
);

3

使用IN条款

   DELETE from tablename where id IN (1,2);

或者,您可以合并使用BETWEENNOT IN来减少您不得不提及的数字。

DELETE from tablename 
where (id BETWEEN 1 AND 255) 
AND (id NOT IN (254));

3

其他人建议IN,这很好。您还可以使用范围:

DELETE from tablename where id<254 and id>3;

如果要删除的ID是连续的。


3

如果您的数据中有一些“条件”来找出254个ID,则可以使用:

delete from tablename
where id in 
(select id from tablename where <your-condition>)

或者简单地:

delete from tablename where <your-condition>

在任何情况下,简单地对id列的254个值进行硬编码都是非常困难的。


2
就像@ tom10271所说的那样,这会在MySQL中产生“您不能在FROM子句中指定目标表”
grexlort,


1

希望能帮助到你:

DELETE FROM tablename 
WHERE tablename.id = ANY (SELECT id FROM tablename WHERE id = id);

对于10.1.37-MariaDB,我收到错误消息:“错误SQL(1235):此版本的MariaDB尚不支持'LIMIT&IN / ALL / ANY / SOME子查询”。
yesnik '19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.