朋友們,我們?cè)谑褂脭?shù)據(jù)庫(kù)的過程中,偶爾會(huì)犯一些低級(jí)錯(cuò)誤。比如我們創(chuàng)建的某一張表,插入了兩條一模一樣的數(shù)據(jù),想要?jiǎng)h除其中一條怎么辦?
這是筆者在頭條問答中看到的一個(gè)問題,并做了回答。感覺這個(gè)問題挺有意思,看似簡(jiǎn)單的問題,我自己也曾經(jīng)犯過這樣的錯(cuò)誤,我下面就以SQLServer為例,提一種處理方法供大家參考。
一張表出現(xiàn)多條一模一樣的數(shù)據(jù)?
很多朋友可能會(huì)覺得奇怪,一張表里面怎么可能出現(xiàn)多條一模一樣的數(shù)據(jù)呢?是的,正常情況這種情況是不應(yīng)該發(fā)生的,因?yàn)槲覀儎?chuàng)建的表基本都會(huì)有主鍵,想要一模一樣是基本不可能的。
但每個(gè)人對(duì)數(shù)據(jù)庫(kù)的掌握程度和應(yīng)用場(chǎng)景不同,有時(shí)候可能創(chuàng)建了一張表(如上圖),陰差陽(yáng)錯(cuò)的沒有設(shè)置主鍵,再陰差陽(yáng)錯(cuò)的插入了兩條或多條一模一樣的數(shù)據(jù),悲劇就這樣產(chǎn)生了。
重復(fù)數(shù)據(jù)是無(wú)法直接刪除的!
插進(jìn)去容易,想要干掉卻就難嘍!如果您在MSSMS中想要?jiǎng)h除這條記錄,首先要打開表內(nèi)容行列表,在某一行上單擊鼠標(biāo)右鍵執(zhí)行刪除菜單,如下圖所示:
您滿心歡喜的以為就這樣搞定了,開心早了!您可能想不到的是,MSSMS提示您:完全一致的數(shù)據(jù)無(wú)法刪除!如下圖所示:
想寫個(gè)SQL刪除腳本來(lái)刪除嗎?
delete test where ...
可您where后面的條件怎么寫,不寫條件,兩條就被一起干掉了哦,寫條件,兩條一模一樣,您怎么寫?
問題到這兒,感覺有點(diǎn)無(wú)解了!其實(shí)不用擔(dān)心,方法還是有的。
為表結(jié)構(gòu)增加一個(gè)自增字段
方法當(dāng)然有很多,我推薦一個(gè)我自己用過的方法,那就是為表結(jié)構(gòu)增加一個(gè)自增的int字段,通過這個(gè)字段將數(shù)據(jù)變成非完全一致,如下圖所示:
我們?cè)黾恿艘粋€(gè)FID字段,設(shè)置為自增字段,表結(jié)構(gòu)更改后,該字段會(huì)被自動(dòng)賦值,從1開始遞增。我們回頭再看看修改表結(jié)構(gòu)之后的數(shù)據(jù)內(nèi)容:
沒錯(cuò),兩條原本一模一樣的數(shù)據(jù),因?yàn)橛辛俗栽鲎侄?,終于變的不一樣了。怎么刪除,我相信絕大部分朋友就有大把的方法了,比如在MSSMS中選中行直接刪除掉,還可以些刪除的SQL腳本:
delete test where fid=2
前面無(wú)法寫腳本,是因?yàn)閣here后面的條件無(wú)從下手,現(xiàn)在有了唯一區(qū)分的字段就不一樣了。
將數(shù)據(jù)表結(jié)構(gòu)還原
表結(jié)構(gòu)如何還原到原來(lái)的樣子呢?很簡(jiǎn)單,進(jìn)入表結(jié)構(gòu)設(shè)計(jì)窗口,把前面新增的字段刪除就行了,當(dāng)然,您也可以寫個(gè)刪除字段的SQL腳本。刪除后,看上去您似乎什么都沒做,但冗余的數(shù)據(jù)卻被您刪除了,參看下圖:
忙活了半天,終于把重復(fù)數(shù)據(jù)刪除了,您是慶幸自己把這活干完了、還是想著如何反省自己不要再犯這類錯(cuò)誤呢?
杜絕此類問題的根本方法
杜絕此類問題的根本方法,就是創(chuàng)建表時(shí),所有的表都要設(shè)置主鍵、設(shè)置主鍵、設(shè)置主鍵,重要的問題說(shuō)三遍!沒有主鍵的表,想想都是可怕的,不僅可能造成數(shù)據(jù)重復(fù),而且查詢效率極低。
當(dāng)然,如果您忘了設(shè)置主鍵、不小心造成了數(shù)據(jù)完全一致無(wú)法刪除,試試我前面的方法也未嘗不可。