昨天遇到一個問題,就是需要刪掉一個表里的重復數據,還有就是希望這個表的ID能夠連續,因為一旦刪掉重復記錄,作為自增主鍵的ID就會不連續了,所以就要想辦法搞定
表中數據:
我想要把名字重復的去掉,但是還希望ID能夠連續。
首先是將數據庫里邊的重復記錄刪掉,我看網上有好多答案是這樣的:
1 delete from people 2 where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1) 3 and rowid not in (select min(rowid) from people group by peopleId having count(peopleId )>1)
但其實我每次運行這條語句都是行不通的,會報錯:
SQL 錯誤 [1093] [HY000]: You can't specify target table 'test1' for update in FROM clause
java.sql.SQLException: You can't specify target table 'test1' for update in FROM clause
去網上查過好像是說update以及delete操作沒辦法跟查詢操作一起做的,我看過有的更新的跟查詢的一起做的好像是給查出來的那部分起個別名,然后進行更新就可以了,但是刪除這個我起了別名也不對,不知道是我寫錯還是不行,我就跳過這個方法了。
我用的方法是:先查出數據庫中的重復記錄的數據中的一條,這個不難,很簡單的,sql語句如下:
select * from test1 where name in (select name from test1 group by name having count(name) > 1) and id in (select min(id) from test1 group by name having count(name)>1)
結果如下:
id |name |phont |
---|--------|-------|
1 |name22 |123 |
3 |name222 |123 |
5 |name2 |123123 |
8 |123 |123123 |
11 |name1 |123123 |
13 |111 |1231 |
14 |112 |1232 |
這些都是不重復的,換句話說都是要保留的,不被刪掉的,而其余與這些結果中name相同的應該被刪掉。
也就是說將上邊那個sql語句id后邊加一個not ,查出來的結果就是要刪掉的:結果如下
id |name |phont |
---|--------|-------|
2 |name22 |123 |
4 |name222 |123 |
6 |name2 |123123 |
7 |name2 |NULL |
9 |123 |123123 |
10 |123 |123123 |
12 |name1 |123123 |
15 |111 |1233 |
16 |112 |1234 |
17 |111 |1235 |
18 |112 |1236 |
我把這些需要刪掉的存到另外一個表里,然后我新建一個test2表,結構復制test1的結構就好了
1 CREATE TABLE `test2` ( 2 `id` int(11) NOT NULL AUTO_INCREMENT, 3 `name` varchar(50) DEFAULT NULL, 4 `phont` varchar(50) DEFAULT NULL, 5 PRIMARY KEY (`id`) 6 ) ENGINE=InnoDB DEFAULT CHARSET=utf8
然后插入語句是:
1 insert into test2( 2 select * from test.test1 where name in (select name from test.test1 group by name having count(name) > 1) 3 and id not in (select min(id) from test.test1 group by name having count(name)>1) 4 )
然后test2的表里的數據就是下圖這樣的:
那接下來做的就是刪掉test1表里邊與test2表的id相同的數據。
1 delete a.* from test1 a, test2 b where a.id = b.id ;
這樣,test1里邊的數據就變成了:
這樣的結果就是完全不重復的,但是我還想要他們的id是連續的,而不是這樣的斷開的。
我的做法是將這個表的除掉id之外的所有字段查出插入到另外一個表test3中,當然,test3要設置id為自增主鍵,但是不插入id,讓它自增,就連續了
當然要新建表test3啦,不過把上邊新建的test2那個復制下來改名字為test3就好啦。
然后插入:
1 insert into test3(name, phont) 2 (select name, phont from test1)
test3表里的結果就是:
這樣就可以把test3改成你想要的名字,然后刪掉test1和test2了,大功告成~
不過感覺還可以就是將已經刪掉重復數據的表test1的數據全都導出來,一般的數據庫連接工具都有這樣的功能,導成sql格式的,然后新建一個表,比test1多增一個自增主鍵字段叫NewId字段,但是Id字段不能再自增了,然后將導成的sql文件導入,不過那個sql文件可能要編輯一下,改一下自增主鍵id變為普通的字段什么的,然后到新表了之后,刪掉id字段,修改NewId為Id,應該也可以,但是這個方法我沒試過,原先預想過要這么做但是沒有這么做,估計以后可以試試,但是感覺兩種的麻煩程度都差不多啊,但是如果將sql語句寫下來之后可能還是第一種方法比較快一點吧。