MySQL數(shù)據(jù)庫(kù)中,如果我們想清空數(shù)據(jù)表(刪除數(shù)據(jù)表中所有內(nèi)容)的話,可以通過(guò)下面兩個(gè)語(yǔ)句來(lái)實(shí)現(xiàn):
truncate table table_n; delete from table_n;
實(shí)例
我們先通過(guò)實(shí)例看下通過(guò)這兩種方式清空數(shù)據(jù)庫(kù)的過(guò)程和結(jié)果
#delete演示 mysql> create table testforde( -> number int not null auto_increment, -> name varchar(20) not null, -> primary key(number) -> ); Query OK, 0 rows affected (0.05 sec) #truncate演示 mysql> create table testfortr( -> number int not null auto_increment, -> name varchar(20) not null, -> primary key(number) -> ); Query OK, 0 rows affected (0.04 sec)
以上是兩張同樣結(jié)構(gòu)的數(shù)據(jù)表,下面我們先插入數(shù)據(jù),然后再分別用 delete
和 truncate
操作它們,看下結(jié)果如何
mysql> insert into testforde(name) values('zhagnsan'),('lisi'),('wanger'),('zhaoliu'),('xiaosan'),('qiqi'),('hanba'); Query OK, 7 rows affected (0.04 sec) Records: 7 Duplicates: 0 Warnings: 0 mysql> insert into testfortr(name) values('zhagnsan'),('lisi'),('wanger'),('zhaoliu'),('xiaosan'),('qiqi'),('hanba'); Query OK, 7 rows affected (0.00 sec) Records: 7 Duplicates: 0 Warnings: 0 mysql> select * from testforde; +--------+----------+ | number | name | +--------+----------+ | 1 | zhagnsan | | 2 | lisi | | 3 | wanger | | 4 | zhaoliu | | 5 | xiaosan | | 6 | qiqi | | 7 | hanba | +--------+----------+ 7 rows in set (0.01 sec) mysql> select * from testfortr; +--------+----------+ | number | name | +--------+----------+ | 1 | zhagnsan | | 2 | lisi | | 3 | wanger | | 4 | zhaoliu | | 5 | xiaosan | | 6 | qiqi | | 7 | hanba | +--------+----------+ 7 rows in set (0.00 sec) mysql> delete from testforde; Query OK, 7 rows affected (0.02 sec) mysql> truncate table testfortr; Query OK, 0 rows affected (0.02 sec) mysql> insert into testforde(name) values('zhagnsan'),('lisi'),('wanger'),('zhaoliu'),('xiaosan'),('qiqi'),('hanba'); Query OK, 7 rows affected (0.00 sec) Records: 7 Duplicates: 0 Warnings: 0 mysql> insert into testfortr(name) values('zhagnsan'),('lisi'),('wanger'),('zhaoliu'),('xiaosan'),('qiqi'),('hanba'); Query OK, 7 rows affected (0.00 sec) Records: 7 Duplicates: 0 Warnings: 0 mysql> select * from testforde; +--------+----------+ | number | name | +--------+----------+ | 8 | zhagnsan | | 9 | lisi | | 10 | wanger | | 11 | zhaoliu | | 12 | xiaosan | | 13 | qiqi | | 14 | hanba | +--------+----------+ 7 rows in set (0.00 sec) mysql> select * from testfortr; +--------+----------+ | number | name | +--------+----------+ | 1 | zhagnsan | | 2 | lisi | | 3 | wanger | | 4 | zhaoliu | | 5 | xiaosan | | 6 | qiqi | | 7 | hanba | +--------+----------+ 7 rows in set (0.00 sec)
從上面操作過(guò)程和結(jié)果不難看出,它們最大的區(qū)別就是delete
在不限定where
條件下清空表的話,不會(huì)重置auto_increment
的值,新插入的會(huì)隨著上次的值接著增加;而truncate
則不然,他會(huì)直接重置為1(其實(shí)這里它做的操作可以理解為直接刪除表結(jié)構(gòu)和內(nèi)容,然后按照表結(jié)構(gòu)重建表)
那么除了上面能明顯看出來(lái)的區(qū)別之外,他們還存在以下幾點(diǎn)區(qū)別:
1、truncate
是整個(gè)清空的,而delete是逐行刪除的。相較而言,truncate
效率較高。
2、在事物處理方面,truncate
可能不會(huì)那么安全。因?yàn)?delete
語(yǔ)句是數(shù)據(jù)庫(kù)操作語(yǔ)言(dml),這個(gè)操作會(huì)放到 rollback segement
中,事務(wù)提交之后才生效;如果有相應(yīng)的 trigger
,執(zhí)行的時(shí)候?qū)⒈挥|發(fā)。而 truncate
是數(shù)據(jù)庫(kù)定義語(yǔ)言(ddl),操作立即生效,原數(shù)據(jù)不放到 rollback segment
中,不能回滾,操作不觸發(fā) trigger
。
3、truncate
只能做清空表使用,而 delete
可以配合 where
,order by
,limit
等字句使用,所以在靈活方面,delete
完勝。
4、truncate
操作不會(huì)記錄到日志中,而delete
則是記錄的。
5、正是由于 truncate
操作不會(huì)記錄到日志中,所以它不會(huì)激活觸發(fā)器。所以對(duì)于由 foreign
約束引用的表,不能使用 truncate table
,而應(yīng)使用不帶 where
子句的 delete
語(yǔ)句。
6、truncate
不能用于參與了索引視圖的表
總結(jié)
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com