MySQL清空數(shù)據(jù)表的方法實例與分析
MySQL數(shù)據(jù)庫中,如果我們想清空數(shù)據(jù)表(刪除數(shù)據(jù)表中所有內(nèi)容)的話,可以通過下面兩個語句來實現(xiàn):
truncate table table_n; delete from table_n;
實例
我們先通過實例看下通過這兩種方式清空數(shù)據(jù)庫的過程和結(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)
從上面操作過程和結(jié)果不難看出,它們最大的區(qū)別就是delete在不限定where條件下清空表的話,不會重置auto_increment的值,新插入的會隨著上次的值接著增加;而truncate則不然,他會直接重置為1(其實這里它做的操作可以理解為直接刪除表結(jié)構(gòu)和內(nèi)容,然后按照表結(jié)構(gòu)重建表)
那么除了上面能明顯看出來的區(qū)別之外,他們還存在以下幾點區(qū)別:
1、truncate是整個清空的,而delete是逐行刪除的。相較而言,truncate效率較高。
2、在事物處理方面,truncate 可能不會那么安全。因為 delete 語句是數(shù)據(jù)庫操作語言(dml),這個操作會放到 rollback segement 中,事務(wù)提交之后才生效;如果有相應(yīng)的 trigger,執(zhí)行的時候?qū)⒈挥|發(fā)。而 truncate 是數(shù)據(jù)庫定義語言(ddl),操作立即生效,原數(shù)據(jù)不放到 rollback segment 中,不能回滾,操作不觸發(fā) trigger。
3、truncate 只能做清空表使用,而 delete 可以配合 where,order by,limit 等字句使用,所以在靈活方面,delete完勝。
4、truncate操作不會記錄到日志中,而delete則是記錄的。
5、正是由于 truncate 操作不會記錄到日志中,所以它不會激活觸發(fā)器。所以對于由 foreign 約束引用的表,不能使用 truncate table,而應(yīng)使用不帶 where 子句的 delete 語句。
6、truncate 不能用于參與了索引視圖的表
總結(jié)
以上就是MySQL清空數(shù)據(jù)表的全部內(nèi)容了,希望這篇文章的內(nèi)容對大家的學(xué)習(xí)或者工作能有所幫助,如果有疑問大家可以留言交流。
相關(guān)文章
MySql 8.0及對應(yīng)驅(qū)動包匹配的注意點說明
這篇文章主要介紹了MySql 8.0及對應(yīng)驅(qū)動包匹配的注意點說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
MySQL 5.7.9 服務(wù)無法啟動-“NET HELPMSG 3534”的解決方法
這篇文章主要介紹了MySQL 5.7.9 服務(wù)無法啟動-“NET HELPMSG 3534”的解決方法,需要的朋友可以參考下2016-12-12
mysql數(shù)據(jù)庫操作_高手進階常用的sql命令語句大全
mysql數(shù)據(jù)庫操作sql命令語句大全:三表連表查詢、更新時批量替換字段部分字符、判斷某一張表是否存在、自動增長恢復(fù)從1開始、查詢重復(fù)記錄、更新時字段值等于原值加上一個字符串、更新某字段為隨機值、復(fù)制表數(shù)據(jù)到另一個表、創(chuàng)建表時拷貝其他表的數(shù)據(jù)和結(jié)構(gòu)...2022-11-11
結(jié)合PHP腳本添加和查詢MySQL數(shù)據(jù)的基本教程
這篇文章主要介紹了結(jié)合PHP腳本添加和查詢MySQL數(shù)據(jù)的基本教程,即在PHP程序中使用基本的SELECT FROM和INSERT INTO語句,需要的朋友可以參考下2015-12-12

