刪除MySQL表中的重復(fù)數(shù)據(jù)吊档?

前言

一般我們將數(shù)據(jù)存儲在MySQL數(shù)據(jù)庫中般堆,它允許我們存儲重復(fù)的數(shù)據(jù)在孝。但是往往重復(fù)的數(shù)據(jù)是作廢的、沒有用的數(shù)據(jù)淮摔,那么通常我們會使用數(shù)據(jù)庫的唯一索引 unique 鍵作為限制私沮。問題來了啊,我還沒有創(chuàng)建唯一索引捏和橙,數(shù)據(jù)就重復(fù)了(我就是忘了仔燕,怎么滴)。

那么如何在一個(gè)普通的數(shù)據(jù)庫表中刪除重復(fù)的數(shù)據(jù)呢魔招?

那我用一個(gè)例子演示一下如何操作晰搀。。办斑。

示例

創(chuàng)建示例數(shù)據(jù)表

CREATE TABLE `flow_card_renewal_comparing` (
  `id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵id',
  `iccId` varchar(32) DEFAULT NULL COMMENT 'ICCID',
  `expireDate` date DEFAULT NULL COMMENT '到期日期',
  `result` int(5) DEFAULT NULL COMMENT '對比結(jié)果',
  `createTime` datetime DEFAULT NULL COMMENT '創(chuàng)建時(shí)間',
  `createBy` varchar(15) DEFAULT NULL COMMENT '創(chuàng)建人',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='對比結(jié)果'

創(chuàng)建示例數(shù)據(jù)

INSERT INTO flow_card_renewal_comparing(iccId, expireDate, `result`, createTime, createBy) VALUES 
('TEST0000111100001330', '2023-02-14', 1, '2023-02-14 15:14:38', NULL), 
('TEST0000111100001330', '2023-02-14', 1, '2023-02-14 15:14:38', NULL), 
('TEST0000111100001330', '2023-02-14', 1, '2023-02-14 15:14:38', NULL), 
('TEST0000111100001334', '2023-02-14', 3, '2023-02-14 15:14:38', NULL), 
('TEST0000111100001335', '2023-02-14', 3, '2023-02-14 15:14:38', NULL), 
('TEST0000111100001335', '2023-02-14', 3, '2023-02-14 15:14:38', NULL), 
('TEST0000111100001335', '2023-02-14', 3, '2023-02-14 15:14:38', NULL), 
('TEST0000111100001335', '2023-02-14', 3, '2023-02-14 15:14:38', NULL), 
('TEST0000111100001340', '2023-02-14', 3, '2023-02-14 15:14:38', NULL), 
('TEST0000111100001341', '2023-02-14', 3, '2023-02-14 15:14:38', NULL), 
('TEST0000111100001342', '2023-02-14', 3, '2023-02-14 15:14:38', NULL), 
('TEST0000111100001343', '2023-02-14', 3, '2023-02-14 15:14:38', NULL), 
('TEST0000111100001343', '2023-02-14', 3, '2023-02-14 15:14:38', NULL), 
('TEST0000111100001343', '2023-02-14', 2, '2023-02-14 15:14:38', NULL), 
('TEST0000111100001343', '2023-02-14', 2, '2023-02-14 15:14:38', NULL), 
('TEST0000111100001343', '2023-02-14', 2, '2023-02-14 15:14:38', NULL); 

創(chuàng)建數(shù)據(jù)如圖

數(shù)據(jù)

現(xiàn)在外恕,我們要根據(jù)主鍵 iccId 去重重復(fù)的數(shù)據(jù),思路:

  1. 篩選出有重復(fù)的業(yè)務(wù)主鍵 iccId
  2. 查詢出 1. 中最小的自增主鍵 id
  3. 令要刪除的數(shù)據(jù) iccId 控制在 1. 和 不等于 2.中
  4. 同時(shí)刪除空的業(yè)務(wù)主鍵數(shù)據(jù)

那么便有以下幾個(gè)查詢:

/*1乡翅、查詢表中有重復(fù)數(shù)據(jù)的主鍵*/
select rd2.iccId from flow_card_renewal_comparing rd2 GROUP by rd2.iccId having count(rd2.iccId)>1

/*2鳞疲、查詢重復(fù)iccid中最小的id號*/
select min(id) from flow_card_renewal_comparing rd2 group by rd2.iccid having count(rd2.iccid)>1

/*3、要刪除的重復(fù)數(shù)據(jù)*/
select
    *
from
    flow_card_renewal_comparing
where
    /*條件為不等于最小id的數(shù)據(jù)全刪除*/
    id not in ( 
        select min(id) from flow_card_renewal_comparing rd2 group by rd2.iccid having count(rd2.iccid)>1 
    )
    and iccId in (
    /*查詢有重復(fù)的iccid*/
        select rd2.iccId from flow_card_renewal_comparing rd2 GROUP by rd2.iccId having count(rd2.iccId)>1 
    )

/*4蠕蚜、再刪除為空的數(shù)據(jù)*/
select
    *
from
    flow_card_renewal_comparing
where
    /*條件為不等于最小id的數(shù)據(jù)全刪除*/
    id not in ( 
        select min(id) from flow_card_renewal_comparing rd2 group by rd2.iccid having count(rd2.iccid)>1 
    )
    and iccId in (
    /*查詢有重復(fù)的iccid*/
        select rd2.iccId from flow_card_renewal_comparing rd2 GROUP by rd2.iccId having count(rd2.iccId)>1 
    )
    or iccId is null

注意一點(diǎn)是mysql做刪除的時(shí)候會提示不能用查詢的結(jié)果來做刪除操作尚洽,這個(gè)時(shí)候就需要將查詢的數(shù)據(jù)作為一個(gè)臨時(shí)表,起別名進(jìn)行刪除啦靶累。那么會變成這樣:

成品

delete
from
    flow_card_renewal_comparing
where
    /*條件為不等于最小id的數(shù)據(jù)全刪除*/
    id not in ( 
        select id from (select min(id) as id from flow_card_renewal_comparing group by iccid having count(iccid)>1) temp1
    )
    and iccId in (
    /*查詢有重復(fù)的iccid*/
        select iccId from (select iccId from flow_card_renewal_comparing GROUP by iccId having count(iccId)>1 ) as temp2
    )
    or iccId is null

尾言

然后在這里再給數(shù)據(jù)庫的主鍵設(shè)置唯一索引啦腺毫!

行啦癣疟,先這樣吧。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末潮酒,一起剝皮案震驚了整個(gè)濱河市争舞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌澈灼,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件店溢,死亡現(xiàn)場離奇詭異叁熔,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)床牧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門荣回,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人戈咳,你說我怎么就攤上這事心软。” “怎么了著蛙?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵删铃,是天一觀的道長。 經(jīng)常有香客問我踏堡,道長猎唁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任顷蟆,我火速辦了婚禮诫隅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘帐偎。我一直安慰自己逐纬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布削樊。 她就那樣靜靜地躺著豁生,像睡著了一般。 火紅的嫁衣襯著肌膚如雪漫贞。 梳的紋絲不亂的頭發(fā)上沛硅,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天,我揣著相機(jī)與錄音绕辖,去河邊找鬼摇肌。 笑死,一個(gè)胖子當(dāng)著我的面吹牛仪际,可吹牛的內(nèi)容都是我干的围小。 我是一名探鬼主播昵骤,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼肯适!你這毒婦竟也來了变秦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤框舔,失蹤者是張志新(化名)和其女友劉穎蹦玫,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體刘绣,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡樱溉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了纬凤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片福贞。...
    茶點(diǎn)故事閱讀 38,716評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖停士,靈堂內(nèi)的尸體忽然破棺而出挖帘,到底是詐尸還是另有隱情,我是刑警寧澤恋技,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布拇舀,位于F島的核電站,受9級特大地震影響蜻底,放射性物質(zhì)發(fā)生泄漏你稚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一朱躺、第九天 我趴在偏房一處隱蔽的房頂上張望刁赖。 院中可真熱鬧,春花似錦长搀、人聲如沸宇弛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽枪芒。三九已至,卻和暖如春谁尸,著一層夾襖步出監(jiān)牢的瞬間舅踪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工良蛮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留抽碌,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓决瞳,卻偏偏與公主長得像货徙,于是被迫代替她去往敵國和親左权。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容