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'),('qi'),('hanba');
quer程式設計客棧y ok, 7 rows affected (0.04 sec)
records: 7 duplicates: 0 warnings: 0
mysql> insert into test values('zhagnsan'),('lisi'),('wanwww.cppcns.comger'),('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 |
+---www.cppcns.com-----+----------+
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清空資料表的方法例項與分析
本文位址:
mysql清空資料表的兩種方法對比
truncate table test table truncate是整體刪除 速度較快 此命令刪除表不寫日誌,不啟用觸發器,但是會重置標識列 自增字段 delete from test table delete 清空表,是逐條刪除,會寫日誌到伺服器,常用場景 刪除部分記錄,結合where條件刪除表...
mysql清空表的方法
清空某個mysql表中所有內容可以有下面兩種方法實現 1.delete from 表名 2.truncate table 表名 不帶where引數的delete語句可以刪除mysql表中所有內容,使用truncate table也可以清空mysql表中所有內容。效率上truncate比delete快...
Oracle清空資料庫中資料表資料的方法
最近在專案發版測試的時候,匯出dmp的時候不小心把開發庫中的一些髒資料匯出來了,測試那邊匯入進去之後一堆不規範的資料,為了不影響測試結果,於是總結了乙個快速清空資料庫資料表所有資料的方法。1 第一種方法 分步驟實現 a 第一步 禁止所有的外來鍵約束.開啟plsql 新建乙個查詢視窗,輸入 selec...