MySQL 如何處理重復(fù)數(shù)據(jù)問(wèn)題

背景

最近運(yùn)維同學(xué)反饋了一條慢查詢(xún)的問(wèn)題舶斧。研究完表結(jié)構(gòu)后,發(fā)現(xiàn)是缺少索引剑肯。
看完了代碼邏輯捧毛,發(fā)現(xiàn)這張表需要添加唯一索引。本想直接添加一個(gè)唯一索引解決問(wèn)題让网。
但是呀忧,表中的數(shù)據(jù)已經(jīng)存在重復(fù)數(shù)據(jù)。直接添加索引添加不成功溃睹。
常規(guī)思維而账,是去除掉重復(fù)數(shù)據(jù),然后再添加唯一索引因篇。

問(wèn)題描述

如何去除表中重復(fù)數(shù)據(jù)泞辐?

解決辦法

方法一:添加唯一索引

ALTER IGNORE TABLE `tbl_like_work` ADD UNIQUE INDEX `uk_tian`(`user_id`, `work_id`)

需要注意SQL語(yǔ)句中使用了 IGNORE 關(guān)鍵字笔横,若不添加此關(guān)鍵字,則添加唯一索引會(huì)失敗咐吼。

若添加索引成功吹缔,則自動(dòng)會(huì)去除重復(fù)數(shù)據(jù)。

IGNORE is a MySQL extension to standard SQL. It controls how ALTER TABLE works if there are duplicates on unique keys in the new table or if warnings occur when strict mode is enabled. If IGNORE is not specified, the copy is aborted and rolled back if duplicate-key errors occur. If IGNORE is specified, only one row is used of rows with duplicates on a unique key. The other conflicting rows are deleted. Incorrect values are truncated to the closest matching acceptable value.

As of MySQL 5.7.4, the IGNORE clause for ALTER TABLE is removed and its use produces an error.

方法二:使用臨時(shí)表

對(duì)于 MySQL 5.7.4 是不支持 INSERT IGNORE的锯茄∠崽粒可以使用臨時(shí)表完成數(shù)據(jù)去重。
通過(guò)使用臨時(shí)表肌幽,備份數(shù)據(jù)晚碾。然后給原表添加唯一索引,再將臨時(shí)表中的數(shù)據(jù)導(dǎo)入到原表喂急,得到去重表格嘁。

整個(gè)流程如下:

  1. 使用臨時(shí)表備份數(shù)據(jù)。根據(jù)原表創(chuàng)建臨時(shí)表
  2. 清掉原表數(shù)據(jù)
  3. 給原表添加唯一索引
  4. 將臨時(shí)表數(shù)據(jù)插入到原表廊移,插入時(shí)忽略重復(fù)數(shù)據(jù)(使用 IGNORE 關(guān)鍵字)
  5. 刪除臨時(shí)數(shù)據(jù)
CREATE TABLE tmp_data SELECT * FROM mytable;
TRUNCATE TABLE mytable;
ALTER TABLE mytable ADD UNIQUE INDEX myindex (A, B, C, D);
INSERT IGNORE INTO mytable SELECT * from tmp_data;
DROP TABLE tmp_data;

方法三:刪除重復(fù)數(shù)據(jù)

如果需要?jiǎng)h除重復(fù)數(shù)據(jù)糕簿,必須找到重復(fù)數(shù)據(jù)。

如何查找重復(fù)數(shù)據(jù)

SELECT *, count(*) as total
FROM `tbl_like_work` 
GROUP BY user_id,work_id
HAVING total > 1

刪除重復(fù)數(shù)據(jù)

DELETE tbl_like_work
WHERE `id` not in (
    SELECT min(id)  # 保留最舊的數(shù)據(jù)
    FROM  `tbl_like_work` 
    GROUP BY user_id,work_id
)

總結(jié)

需要注意的是画机,方法二會(huì)更改原表的主鍵ID冶伞,對(duì)于有主鍵依賴(lài)的業(yè)務(wù)。不能使用第二種方法步氏。
建議使用方法一、方法三徒爹,只刪除重復(fù)數(shù)據(jù)荚醒,且不會(huì)對(duì)原數(shù)據(jù)做出修改。

參考資料

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末隆嗅,一起剝皮案震驚了整個(gè)濱河市界阁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌胖喳,老刑警劉巖泡躯,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異丽焊,居然都是意外死亡较剃,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)技健,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)写穴,“玉大人,你說(shuō)我怎么就攤上這事雌贱“∷停” “怎么了偿短?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)馋没。 經(jīng)常有香客問(wèn)我昔逗,道長(zhǎng),這世上最難降的妖魔是什么篷朵? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任纤子,我火速辦了婚禮,結(jié)果婚禮上款票,老公的妹妹穿的比我還像新娘控硼。我一直安慰自己,他們只是感情好艾少,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布卡乾。 她就那樣靜靜地躺著,像睡著了一般缚够。 火紅的嫁衣襯著肌膚如雪幔妨。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,821評(píng)論 1 290
  • 那天谍椅,我揣著相機(jī)與錄音误堡,去河邊找鬼。 笑死雏吭,一個(gè)胖子當(dāng)著我的面吹牛锁施,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播杖们,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼悉抵,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了摘完?” 一聲冷哼從身側(cè)響起姥饰,我...
    開(kāi)封第一講書(shū)人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎孝治,沒(méi)想到半個(gè)月后列粪,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谈飒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年岂座,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片步绸。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡掺逼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出瓤介,到底是詐尸還是另有隱情吕喘,我是刑警寧澤赘那,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站氯质,受9級(jí)特大地震影響募舟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜闻察,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一拱礁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧辕漂,春花似錦呢灶、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至跋涣,卻和暖如春缨睡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背陈辱。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工奖年, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人沛贪。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓陋守,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親鹏浅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嗅义,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

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

  • pyspark.sql模塊 模塊上下文 Spark SQL和DataFrames的重要類(lèi): pyspark.sql...
    mpro閱讀 9,448評(píng)論 0 13
  • 手動(dòng)不易,轉(zhuǎn)發(fā)請(qǐng)注明出處 --Trance 數(shù)據(jù)庫(kù)系統(tǒng)命令: (1).查看存儲(chǔ)過(guò)程狀態(tài):show pro...
    Trance_b54c閱讀 1,654評(píng)論 0 8
  • --- layout: post title: "如果有人問(wèn)你關(guān)系型數(shù)據(jù)庫(kù)的原理隐砸,叫他看這篇文章(轉(zhuǎn))" date...
    藍(lán)墜星閱讀 780評(píng)論 0 3
  • SQL SERVER提供了多種索引。如果以存儲(chǔ)結(jié)構(gòu)結(jié)構(gòu)來(lái)區(qū)分蝙眶,有聚集索引和非聚集索引季希;如果以數(shù)據(jù)的唯一性來(lái)區(qū)分,則...
    不知名的蛋撻閱讀 6,031評(píng)論 0 5
  • 本文主要總結(jié)了工作中一些常用的操作及不合理的操作幽纷,在對(duì)慢查詢(xún)進(jìn)行優(yōu)化時(shí)收集的一些有用的資料和信息式塌,本文適合有MyS...
    Chting閱讀 593評(píng)論 0 1