本文章總結(jié)了關(guān)于在mysql數(shù)據(jù)庫(kù)中各種刪除重復(fù)記錄的sql語(yǔ)句,下面我們用實(shí)例介紹了操作方法,大家可參考一下.
MYSQL數(shù)據(jù)庫(kù)中,經(jīng)常會(huì)遇到重復(fù)記錄的情況,那么就需要SQL刪除重復(fù)記錄,下面為您列舉了四種刪除重復(fù)記錄的方式,用于不同的情況,希望對(duì)您有所幫助.
1、查找表中多余的重復(fù)記錄,重復(fù)記錄是根據(jù)單個(gè)字段(peopleId)來(lái)判斷,代碼如下:
- select * from people where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)
2、SQL刪除重復(fù)記錄,重復(fù)記錄是根據(jù)單個(gè)字段(peopleId)來(lái)判斷,只留有rowid最小的記錄,代碼如下:
- delete from people where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1) and rowid not in (select min(rowid) from people group by peopleId having count(peopleId )>1)
3、查找表中多余的重復(fù)記錄(多個(gè)字段),代碼如下:
- select * from vitae a where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
4、刪除表中多余的重復(fù)記錄(多個(gè)字段),只留有rowid最小的記錄,代碼如下:
- delete from vitae a where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1) and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)
演示數(shù)據(jù),表結(jié)構(gòu),代碼如下:
- mysql> desc demo;
- +-------+------------------+------+-----+---------+----------------+
- | Field | Type | Null | Key | Default | Extra |
- +-------+------------------+------+-----+---------+----------------+
- | id | int(11) unsigned | NO | PRI | NULL | auto_increment |
- | site | varchar(100) | NO | MUL | | |
- +-------+------------------+------+-----+---------+----------------+
- 2 rows in set (0.00 sec)
數(shù)據(jù),代碼如下:
- mysql> select * from demo order by id;
- +----+------------------------+
- | id | site |
- +----+------------------------+
- | 1 | http://m.survivalescaperooms.comn |
- | 2 | http://安卓主題_m.survivalescaperooms.com |
- | 3 | http://www.zhutiy.com |
- | 4 | http://m.survivalescaperooms.comn |
- | 5 | http://www.zhutiy.com |
- +----+------------------------+
- 5 rows in set (0.00 sec)
當(dāng)沒有創(chuàng)建表或創(chuàng)建索引權(quán)限的時(shí)候,可以用下面的方法,如果你要?jiǎng)h除較舊的重復(fù)記錄,可以使用下面的語(yǔ)句:
- mysql> delete from a
- -> using demo as a, demo as b
- -> where (a.id > b.id)
- -> and (a.site = b.site);
- Query OK, 2 rows affected (0.12 sec)
- mysql> select * from demo order by id;
- +----+------------------------+
- | id | site |
- +----+------------------------+
- | 1 | http://m.survivalescaperooms.comn |
- | 2 | http://安卓主題_m.survivalescaperooms.com |
- | 3 | http://www.zhutiy.com |
- +----+------------------------+
- 3 rows in set (0.00 sec)
如果你要?jiǎng)h除較新的重復(fù)記錄,可以使用下面的語(yǔ)句:
- mysql> delete from a
- -> using demo as a, demo as b
- -> where (a.id < b.id)
- -> and (a.site = b.site);
- Query OK, 2 rows affected (0.12 sec)
- mysql> select * from demo order by id;
- +----+------------------------+
- | id | site |
- +----+------------------------+
- | 2 | http://安卓主題_m.survivalescaperooms.com |
- | 4 | http://m.survivalescaperooms.comn |
- | 5 | http://www.zhutiy.com |
- +----+------------------------+
- 3 rows in set (0.00 sec)
你可以用下面的語(yǔ)句先確認(rèn)將被刪除的重復(fù)記錄,代碼如下:
- mysql> SELECT a.*
- -> FROM demo a, demo b
- -> WHERE a.id > b.id
- -> AND (a.site = b.site);
- +----+------------------------+
- | id | site |
- +----+------------------------+
- | 1 | http://m.survivalescaperooms.comn |
- | 3 | http://www.zhutiy.com |
- +----+------------------------+
- 2 rows in set (0.00 sec)
如果有創(chuàng)建索引的權(quán)限,可以用下面的方法,在表上創(chuàng)建唯一鍵索引,代碼如下:
- mysql> alter ignore table demo add unique index ukey (site);
- Query OK, 5 rows affected (0.46 sec)
- Records: 5 Duplicates: 2 Warnings: 0
- mysql> select * from demo order by id;
- +----+------------------------+
- | id | site |
- +----+------------------------+
- | 1 | http://m.survivalescaperooms.comn |
- | 2 | http://安卓主題_m.survivalescaperooms.com |
- | 3 | http://www.zhutiy.com |
- +----+------------------------+
- 3 rows in set (0.00 sec)
重復(fù)記錄被刪除后,如果需要,可以刪除索引,代碼如下:
- mysql> alter table demo drop index ukey;
- Query OK, 3 rows affected (0.37 sec)
- Records: 3 Duplicates: 0 Warnings: 0
如果有創(chuàng)建表的權(quán)限,可以用下面的方法,創(chuàng)建一個(gè)新表,然后將原表中不重復(fù)的數(shù)據(jù)插入新表,代碼如下:
- mysql> create table demo_new as select * from demo group by site;
- Query OK, 3 rows affected (0.19 sec)
- Records: 3 Duplicates: 0 Warnings: 0
- mysql> show tables;
- +----------------+
- | Tables_in_test |
- +----------------+
- | demo |
- | demo_new |
- +----------------+
- 2 rows in set (0.00 sec)
- mysql> select * from demo order by id;
- +----+------------------------+
- | id | site |
- +----+------------------------+
- | 1 | http://m.survivalescaperooms.comn |
- | 2 | http://安卓主題_m.survivalescaperooms.com |
- | 3 | http://www.zhutiy.com |
- | 4 | http://m.survivalescaperooms.comn |
- | 5 | http://www.zhutiy.com |
- +----+------------------------+
- 5 rows in set (0.00 sec)
- mysql> select * from demo_new order by id;
- +----+------------------------+
- | id | site |
- +----+------------------------+
- | 1 | http://m.survivalescaperooms.comn |
- | 2 | http://安卓主題_m.survivalescaperooms.com |
- | 3 | http://www.zhutiy.com |
- +----+------------------------+
- 3 rows in set (0.00 sec)
然后將原表備份,將新表重命名為當(dāng)前表,代碼如下:
- mysql> rename table demo to demo_old, demo_new to demo;
- Query OK, 0 rows affected (0.04 sec)
- mysql> show tables;
- +----------------+
- | Tables_in_test |
- +----------------+
- | demo |
- | demo_old |
- +----------------+
- 2 rows in set (0.00 sec)
- mysql> select * from demo order by id;
- +----+------------------------+
- | id | site |
- +----+------------------------+
- | 1 | http://m.survivalescaperooms.comn |
- | 2 | http://安卓主題_m.survivalescaperooms.com |
- | 3 | http://www.zhutiy.com |
- +----+------------------------+
- 3 rows in set (0.00 sec)
注意:使用這種方式創(chuàng)建的表會(huì)丟失原表的索引信息,代碼如下:
- mysql> desc demo;
- +-------+------------------+------+-----+---------+-------+
- | Field | Type | Null | Key | Default | Extra |
- +-------+------------------+------+-----+---------+-------+
- | id | int(11) unsigned | NO | | 0 | |
- | site | varchar(100) | NO | | | |
- +-------+------------------+------+-----+---------+-------+
- 2 rows in set (0.00 sec)
如果要保持和原表信息一致,你可以使用 show create table demo; 來(lái)查看原表的創(chuàng)建語(yǔ)句,然后使用原表的創(chuàng)建語(yǔ)句創(chuàng)建新表,接著使用 insert … select 語(yǔ)句插入數(shù)據(jù),再重命名表即可.
實(shí)例:今天無(wú)意導(dǎo)入幾個(gè)測(cè)試數(shù)據(jù),發(fā)現(xiàn)測(cè)試數(shù)據(jù)中,有很多數(shù)據(jù)記錄是相同的,我現(xiàn)在就想刪除掉這些數(shù)據(jù),如何查詢數(shù)據(jù)相同記錄呢?這個(gè)好說(shuō),以下語(yǔ)句就可以查看相同記錄的了:
SELECT COUNT(*) AS c, key_word FROM search_keywrod GROUP BY key_word HAVING c > 1
其中 HAVING c >1 代表相同記錄數(shù)就有相同的了。
查詢相同的是比較容易實(shí)現(xiàn)的了,但是想要?jiǎng)h除這些重復(fù)的,估計(jì)就比較麻煩的了,因?yàn)槟闶且獎(jiǎng)h除自身表里的記錄,有些朋友可能就會(huì)使用到臨時(shí)表,把相同需要?jiǎng)h除的記錄,導(dǎo)到時(shí)這個(gè)臨時(shí)表,然后再通過臨時(shí)表來(lái)刪除主表,或者寫一個(gè)臨時(shí)程序,刪除掉其中的一條重復(fù)記錄.
以上二個(gè)方法刪除重復(fù)記錄,最大的麻煩就是操作繁瑣,而我們今天介紹的就是利用MYSQL自身的語(yǔ)句,不創(chuàng)建臨時(shí)表,不寫程序來(lái)刪除掉自身的重復(fù)記錄,請(qǐng)看以下SQL語(yǔ)句:
- SELECT t1.id, t1.key_word
- FROM search_keywrod t1, (
- SELECT key_word, MIN(id) AS minid
- FROM search_keywrod
- GROUP BY key_word HAVING COUNT(key_word) > 1
- )t2
- WHERE t1.key_word = t2.key_word AND t1.id = t2.minid
這條語(yǔ)句就跟我們第一條語(yǔ)句是一樣的功能,但是這條語(yǔ)句好處就是MIN(id),可以控制是刪除大的id重復(fù)記錄(MAX),還是刪除小的id重復(fù)記錄(MIN).
OK,經(jīng)過改良的語(yǔ)句實(shí)現(xiàn)了查詢,現(xiàn)在就可以利用DELETE FROM語(yǔ)句來(lái)刪除了,代碼如下:
- DELETE FROM search_keywrod WHERE id IN (SELECT id FROM (
- SELECT t1.id
- FROM search_keywrod t1, (
- SELECT key_word, MIN(id) AS minid FROM search_keywrod
- GROUP BY key_word HAVING COUNT(key_word) > 1
- )t2
- WHERE t1.key_word = t2.key_word AND t1.id = t2.minid
- )t3)
執(zhí)行時(shí),請(qǐng)多執(zhí)行幾次,因?yàn)槊看蝿h除時(shí),只刪除掉重復(fù)的一次記錄,如果你一條記錄重復(fù)五次,那你就要執(zhí)行五次的了,所以多執(zhí)行幾次,直到?jīng)]有可刪除的記錄了,這樣你直接一條語(yǔ)句刪除掉重復(fù)的mysql記錄功能就實(shí)現(xiàn)了.
新聞熱點(diǎn)
疑難解答
圖片精選