MySQL數據庫中,如果我們想清空數據表(刪除數據表中所有內容)的話,可以通過下面兩個語句來實現:
truncate table table_n; delete from table_n;
實例
我們先通過實例看下通過這兩種方式清空數據庫的過程和結果
#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)
以上是兩張同樣結構的數據表,下面我們先插入數據,然後再分別用 delete
和 truncate
操作它們,看下結果如何
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)
從上面操作過程和結果不難看出,它們最大的區別就是delete
在不限定where
條件下清空表的話,不會重置auto_increment
的值,新插入的會隨著上次的值接著增加;而truncate
則不然,他會直接重置為1(其實這裡它做的操作可以理解為直接刪除表結構和內容,然後按照表結構重建表)
那麼除了上面能明顯看出來的區別之外,他們還存在以下幾點區別:
1、truncate
是整個清空的,而delete是逐行刪除的。相較而言,truncate
效率較高。
2、在事物處理方面,truncate
可能不會那麼安全。因為 delete
語句是數據庫操作語言(dml),這個操作會放到 rollback segement
中,事務提交之後才生效;如果有相應的 trigger
,執行的時候將被觸發。而 truncate
是數據庫定義語言(ddl),操作立即生效,原數據不放到 rollback segment
中,不能回滾,操作不觸發 trigger
。
3、truncate
只能做清空表使用,而 delete
可以配合 where
,order by
,limit
等字句使用,所以在靈活方面,delete
完勝。
4、truncate
操作不會記錄到日志中,而delete
則是記錄的。
5、正是由於 truncate
操作不會記錄到日志中,所以它不會激活觸發器。所以對於由 foreign
約束引用的表,不能使用 truncate table
,而應使用不帶 where
子句的 delete
語句。
6、truncate
不能用於參與了索引視圖的表
總結
以上就是MySQL清空數據表的全部內容了,希望這篇文章的內容對大家的學習或者工作能有所幫助,如果有疑問大家可以留言交流。