想要删除数百万条具有重复列值的记录,如果发现重复,则删除这两行。
如果第一行的列值为abcv,并且发现另一行让第10行具有相同的值,则在这种情况下删除我找到abcv的两行。
我正在尝试
Delete from TABLE where column in(1,2,3,4,6,9)
但上面的查询不适合我的情况,因为我在IN子句中有一个非常长的字符串。
我需要用数百万条记录执行此操作。
答案 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将会出错。与往常一样,您可能希望在运行此类内容之前进行备份...