MySql 删除重复数据
為什么80%的碼農都做不了架構師?>>> ??
假設表結構
CREATE TABLE `users` (??????????????????????????
???????????????`id` int(10) NOT NULL AUTO_INCREMENT,??????????????????????????????????
???????????????`name` char(50) NOT NULL,??????????????????????????????
???????????????PRIMARY KEY (`id`)???????????????????????????????????
?????????????)
一般有兩個方法:
1. 是用中間表來實現
???1) 使用 create table like 復制出來一個中間表 ,然后用insert into select 把不重復的表導入到中間表中,然后再用中間表替代舊表。 具體實現如下
??create table tmp_users like users;
??Insert into tmp_users (id, name) select min(`id`), `name` ? from users group by name ;
??drop ?table?users?;
??alter ?table ?tmp_users?rename?users;
????2) 使用 create table select 直接復制出來一個含有數據的中間表 然后用中間表替代舊表。 具體實現如下
??create table tmp_users(id, name)? select min(`id`),`name` ? from users group by name ;
??truncate table users;
??insert into users select * from tmp_users;
??drop table tmp_users;
以上兩種方法的區別就是 create table like?
和 create table select 的區別 ,create table like 復制的表結構包含索引 而 create table select 不包含索引,沒有索引對業務影響很大,這個要特別留意的。還有就是create table like?和 create table select?復制的表沒有把表的權限給copy過來。要事后從新設置下。數據量大的時候應該選擇 create table select ,先傾倒數據事后再為表建立索引。
至于用中間表的數據更新舊表的策略,要么用drop舊表再rename中間表。 要么清空舊表數據再導入中間表數據。數據量大的時候前面方法效率較高。
2. 1)找到要刪除的數據 然后刪除這些數據。具體實現如下,
?
????delete users as a from users as a,(
?????????select min(id) as id_temp , name from users group by name having count(name) > 1
?????) as b
?????where a.name = b.name and a.id <> b.id_temp;
?????加上 having count(name) > 1 可以避免掃描沒有重復的記錄,提高效率
??2)找到要保留的數據 然后用not in 來刪除不再這些數據中的記錄。大家很容易就想到如下的sql語句:
?????delete from users where id not in ( select min(id)?from users group by name ); 但是mysql刪?除動作不能帶有本表的查詢動作,意思是你刪除users表的東西不能以users表的信息為條件 所以這個語句會報錯,執行不了。只要通過創建臨時表作為查詢條件。具體實現如下:
delete from users where id not in ( select * from ( select min(id)?from users group by name ) as temp );
ps: count(x)會排除字段x為空的情況,加入name中存在null的值,則使用group by having的時候不要用count(name),而是使用count( id )
轉載于:https://my.oschina.net/u/1773689/blog/281998
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的MySql 删除重复数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二叉查找树(binary search
- 下一篇: EDM营销之邮件投递篇