删除数百万条mysql中具有重复列值的记录

时间:2015-09-18 10:56:21

标签: php mysql

想要删除数百万条具有重复列值的记录,如果发现重复,则删除这两行。

如果第一行的列值为abcv,并且发现另一行让第10行具有相同的值,则在这种情况下删除我找到abcv的两行。

我正在尝试

Delete from TABLE where column in(1,2,3,4,6,9) 

但上面的查询不适合我的情况,因为我在IN子句中有一个非常长的字符串。

我需要用数百万条记录执行此操作。

3 个答案:

答案 0 :(得分:1)

澄清一下:如果多行共享特定的列值,是否要删除它们 all ?我认为这就是你所说的。

首先,您需要找到具有重复值的行。这适用于这样的子查询。

              SELECT * 
                FROM table
               WHERE colval_with_duplicates IN (
                         SELECT colval_with_duplicates
                           FROM table
                          GROUP BY colval_with_duplicates
                         HAVING COUNT(*) >= 2)
               ORDER BY colval ,id

在继续使用它删除内容之前,您应该测试此子查询。为什么?因为我还不确定我理解你的要求。此子查询显示将被删除的行。

然后你想在DELETE查询中使用这个子查询的一个版本,就像这样。

 DELETE FROM TABLE
  WHERE id IN (
              SELECT id 
                FROM table
               WHERE colval_with_duplicates IN (
                         SELECT colval_with_duplicates
                           FROM table
                          GROUP BY colval_with_duplicates
                         HAVING COUNT(*) >= 2)
               LIMIT 1000
              )

你有一张大桌子,所以你想要批量删除而不是一次性删除。如果您尝试一次性完成所有操作,可能会耗尽您的事务日志空间,这将花费很长时间。 LIMIT 1000将一次批量处理一千个重复键值。您只需重复此DELETE查询,直到它不影响任何行,您就完成了。

确保批量重复的列值,而不是批量的ID值。

答案 1 :(得分:0)

Where
 - TableName is 'Employee' Assumed.
 - 'id' is a column (having primary key and Auto increment, which is mainly ist column of table)
 - 'stud_id' is a column name having duplicate values.

So, change accordingly the column name and table name.

 - It will delete all duplicate values.
        DELETE T1,T2 FROM Employee T1, Employee T2 
        WHERE T1.id > T2.id AND T1.stud_id = T2.stud_id

 - It WIll Delete one duplicate values from column
       DELETE T1 FROM Employee T1, Employee T2 
       WHERE T1.id > T2.id AND T1.stud_id = T2.stud_id

有关详细信息,请查看此Delete Duplicate Data From Table链接。

答案 2 :(得分:-1)

在列上添加UNIQUE索引。编写ALTER语句时,请包含IGNORE关键字。像这样

ADD UNIQUE INDEX idx_name (column);
ALTER IGNORE TABLE table_name

这将删除所有重复的行。作为一个额外的好处,未来的重复INSERT将会出错。与往常一样,您可能希望在运行此类内容之前进行备份...