Mysql删除重复数据只保留一条
count(*)将返回表格中所有存在的行的总数包括值为null的行,然而count(列名)将返回表格中除去null以外的所有行的总数(有默认值的列也会被计入)
- 查询全部重复的数据:
Select * From 表 Where 重复字段 In (Select 重复字段 From 表 Group By 重复字段 Having Count(*)>1)
- 删除全部重复试题:
将上面的查询select改为delete(这样会出错的)
DELETE FROM dept WHERE dname IN (
SELECT dname FROM dept GROUP BY dname HAVING count(1) > 1
)
会出现如下错误:
[Err] 1093 - You can't specify target table 'dept' for update in FROM clause
原因是:更新这个表的同时又查询了这个表,查询这个表的同时又去更新了这个表,可以理解为死锁。mysql不支持这种更新查询同一张表的操作
解决办法:把要更新的几列数据查询出来做为一个第三方表,然后筛选更新。
DELETE FROM table WHERE id IN (
SELECT id FROM (
SELECT id,COUNT(*) FROM table GROUP BY id HAVING COUNT(*) > 1
) AS a
);
缺点:此语句可能需要执行多次才能删除干净,建议改写存储过程
版权属于:LCQ(除特别注明外)
本文链接:https://on1979.com/archives/901/
本站文章采用 知识共享署名4.0 国际许可协议 进行许可,请在转载时注明出处及本声明!