MYSQL數(shù)據(jù)庫多余的數(shù)據(jù)表清理方法:
十多年的順慶網(wǎng)站建設(shè)經(jīng)驗(yàn),針對設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。全網(wǎng)營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整順慶建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)公司從事“順慶網(wǎng)站設(shè)計(jì)”,“順慶網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
drop table命令用于刪除數(shù)據(jù)表。
drop table命令格式:drop table 表名;
例如,刪除表名為 MyClass 的表:
mysql drop table MyClass;
DROP TABLE用于刪除一個(gè)或多個(gè)表。必須有每個(gè)表的DROP權(quán)限。所有的表數(shù)據(jù)和表定義會(huì)被取消,所以使用本語句要小心。
首先是將數(shù)據(jù)庫里邊的重復(fù)記錄刪掉,我看網(wǎng)上有好多答案是這樣的:
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)
但其實(shí)我每次運(yùn)行這條語句都是行不通的,會(huì)報(bào)錯(cuò):
SQL 錯(cuò)誤 [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
去網(wǎng)上查過好像是說update以及delete操作沒辦法跟查詢操作一起做的,我看過有的更新的跟查詢的一起做的好像是給查出來的那部分起個(gè)別名,然后進(jìn)行更新就可以了,但是刪除這個(gè)我起了別名也不對,不知道是我寫錯(cuò)還是不行,我就跳過這個(gè)方法了。
我用的方法是:先查出數(shù)據(jù)庫中的重復(fù)記錄的數(shù)據(jù)中的一條,這個(gè)不難,很簡單的,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)
結(jié)果如下:
id |name |phont |
---|--------|-------|
1 |name22 |123 |
3 |name222 |123 |
5 |name2 |123123 |
8 |123 |123123 |
11 |name1 |123123 |
13 |111 |1231 |
14 |112 |1232 |
這些都是不重復(fù)的,換句話說都是要保留的,不被刪掉的,而其余與這些結(jié)果中name相同的應(yīng)該被刪掉。
也就是說將上邊那個(gè)sql語句id后邊加一個(gè)not ,查出來的結(jié)果就是要?jiǎng)h掉的:結(jié)果如下
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 |
我把這些需要?jiǎng)h掉的存到另外一個(gè)表里,然后我新建一個(gè)test2表,結(jié)構(gòu)復(fù)制test1的結(jié)構(gòu)就好了
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的表里的數(shù)據(jù)就是下圖這樣的:
那接下來做的就是刪掉test1表里邊與test2表的id相同的數(shù)據(jù)。
1 delete a.* from test1 a, test2 b where a.id = b.id ;
這樣,test1里邊的數(shù)據(jù)就變成了:
這樣的結(jié)果就是完全不重復(fù)的,但是我還想要他們的id是連續(xù)的,而不是這樣的斷開的。
我的做法是將這個(gè)表的除掉id之外的所有字段查出插入到另外一個(gè)表test3中,當(dāng)然,test3要設(shè)置id為自增主鍵,但是不插入id,讓它自增,就連續(xù)了
當(dāng)然要新建表test3啦,不過把上邊新建的test2那個(gè)復(fù)制下來改名字為test3就好啦。
然后插入:
1 insert into test3(name, phont)2 (select name, phont from test2)
test3表里的結(jié)果就是:
這樣就可以把test3改成你想要的名字,然后刪掉test1和test2了,大功告成~
不過感覺還可以就是將已經(jīng)刪掉重復(fù)數(shù)據(jù)的表test1的數(shù)據(jù)全都導(dǎo)出來,一般的數(shù)據(jù)庫連接工具都有這樣的功能,導(dǎo)成sql格式的,然后新建一個(gè)表,比test1多增一個(gè)自增主鍵字段叫NewId字段,但是Id字段不能再自增了,然后將導(dǎo)成的sql文件導(dǎo)入,不過那個(gè)sql文件可能要編輯一下,改一下自增主鍵id變?yōu)槠胀ǖ淖侄问裁吹模缓蟮叫卤砹酥?,刪掉id字段,修改NewId為Id,應(yīng)該也可以,但是這個(gè)方法我沒試過,原先預(yù)想過要這么做但是沒有這么做,估計(jì)以后可以試試,但是感覺兩種的麻煩程度都差不多啊,但是如果將sql語句寫下來之后可能還是第一種方法比較快一點(diǎn)吧。
具體操作如下:delete刪除表中的數(shù)據(jù)delete好from結(jié)合使用,格式一般為:deletefrom表名where條件,delete刪除數(shù)據(jù)是將Mysql表中的數(shù)據(jù)一行一行的刪除,不刪除表的結(jié)構(gòu),也不釋放表的空間,可以回滾(rollback)。