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






