日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MySql 删除重复数据

發布時間:2025/7/14 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 删除重复数据的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。