【问题标题】:How to delete a range of records at once on MySQL?如何在 MySQL 上一次删除一系列记录?
【发布时间】:2011-12-19 19:43:46
【问题描述】:

我的表中有超过 60000 行。如何一次删除 40000 到 50000 的行?

【问题讨论】:

  • 行有自动递增的键吗?
  • 您有顺序 ID 吗?表的结构是什么?你试过什么?为什么你不能只使用带范围的简单 DELETE?
  • 这里是DELETE命令(dev.mysql.com/doc/refman/5.6/en/delete.html)的语法,例如:DELETE FROM mytable WHERE colname='XXX';

标签: mysql sql


【解决方案1】:

你可以使用between函数:

delete from exampleTable where id between 40000 and 50000

或:

delete from exampleTable where id >= 40000 and id <= 50000

很简单?

【讨论】:

    【解决方案2】:

    我假设您希望根据表的默认顺序执行此操作,并且您没有自然键或其他方式在表数据中对这些进行排序。

    SELECT * FROM WORDS 返回:

    Hi
    Hello
    Bye
    Goodbye
    What's up
    

    因此,如果您说要删除第 2 到 4 行,是否要删除 Hello、Bye 和 Goodbye。正确的?

    您的餐桌的退货顺序是否确定?换句话说,你每次都以相同的顺序得到结果?理想情况下,您将能够识别表中包含您可以关闭的数据的列,这将让您使用 Tricker 的答案。

    如果不是这样,您将需要在 between 语句中使用行号。我不是 mysql 用户,如果我是,下面的代码无疑会更干净。此外,我什至没有 mysql 数据库来测试查询。我使用这篇文章整理了一个 sql 语句作为如何在 mysql 中获取行 num 的参考。 With MySQL, how can I generate a column containing the record index in a table?

    我的查询假设您的表上有某种主键。如果没有,则无法保证您不会删除无关的行,而且它是良好的表设计。

    DELETE FROM YOUR_TABLE 
    WHERE primarykey = 
    (SELECT  primarykey FROM 
       (SELECT t.primarykey, 
               @curRow := @curRow + 1 AS row_number
       FROM    YOUR_TABLE t
       JOIN    (SELECT @curRow := 0) r) 
    WHERE row_number between 40000 and 50000);
    

    【讨论】:

      【解决方案3】:

      如果您没有主键并且想按行数(即行范围)删除, 它可以通过mysql导出导入来完成。 执行自定义导出 - 指定起始行和计数。 在您的情况下,您需要两个导出:一个用于 0-40k 行,第二个用于 50-last。 然后将这两个文件导入表中。 注意:如果导入大文件有问题,我推荐 BigDump。 http://www.ozerov.de/bigdump/

      【讨论】:

        【解决方案4】:

        桌子:杂货店

        id  item  
        ----------            
        1   rice
        2   soap
        3   rice
        4   rice
        

        从“杂货店”中删除 item="rice" LIMIT 2;

        这比所有其他想法都容易。对于这个特定的项目,有 2 条记录可以删除。

        答案是,

        2 rows deleted.

        从杂货店选择 *;

        id  item    
        ----------         
        1   rice
        2   soap
        

        【讨论】:

        • 虽然从技术上讲你可以使用LIMIT 这个例子是不够的,但没有订单的限制可能会导致意想不到的结果。 3 年前提供的可接受的答案更适合 OP 的需求,这个例子根本没有反映 OP 的问题。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-11
        • 2020-12-31
        • 2011-04-29
        • 2013-12-21
        • 2015-01-04
        • 2021-01-01
        • 1970-01-01
        相关资源
        最近更新 更多