在本教學中,您將學習如何使用MySQL TRUNCATE TABLE
語句刪除表中的所有數據。
MySQL TRUNCATE TABLE語句簡介
MySQL TRUNCATE TABLE
語句允許您刪除表中的所有數據。 因此,在功能方面,TRUNCATE TABLE
語句就像沒有WHERE子句的DELETE語句。 但是,在某些情況下,MySQL TRUNCATE TABLE
語句比DELETE
語句更有效。
MySQL TRUNCATE TABLE
語句的語法如下:
TRUNCATE TABLE table_name;
在TRUNCATE TABLE
子句後面指定要刪除所有數據的表名稱。
TABLE
關鍵字是可選的。 但是,應該使用它來區分TRUNCATE TABLE
語句和TRUNCATE
函數。
如果您使用InnoDB表,MySQL將在刪除數據之前檢查表中是否有可用的外鍵約束。 以下是一些情況:
- 如果表具有任何外鍵約束,則
TRUNCATE TABLE
語句會逐個刪除行。如果外鍵約束具有DELETE CASCADE
動作,則子表中的相應行也將被刪除。 - 如果外鍵約束沒有指定DELETE CASCADE動作,則
TRUNCATE TABLE
將逐個刪除行,並且遇到由子表中的行引用的行時,它將停止併發出錯誤。 - 如果表沒有任何外鍵約束,則
TRUNCATE TABLE
語句將刪除該表並重新創建一個具有相同結構的新表,這比使用DELETE
語句特別是對於大表更快更有效。
如果您使用其他存儲引擎,則TRUNCATE TABLE
語句將刪除並重新創建一個新表。
請注意,如果表具有
AUTO_INCREMENT
列,則TRUNCATE TABLE
語句將自動遞增值重置為零。
此外,TRUNCATE TABLE
語句不使用DELETE
語句,因此與表關聯的DELETE觸發器將不被調用。
MySQL TRUNCATE TABLE示例
首先,創建一個名為books
的新表:
CREATE DATABASE IF NOT EXISTS testdb;
USE testdb;
CREATE TABLE books(
id int auto_increment primary key,
title varchar(255) not null
)ENGINE=InnoDB;
接下來,使用以下存儲過程填充books
表的數據:
DELIMITER $$
CREATE PROCEDURE load_book_data(IN num int(10))
BEGIN
DECLARE counter int(10) default 0;
DECLARE book_title varchar(255) default '';
WHILE counter < num DO
SET book_title = concat('Book title #',counter);
SET counter = counter + 1;
INSERT INTO books(title) VALUES(book_title);
END WHILE;
END$$
DELIMITER ;
-- DROP PROCEDURE load_book_data;
然後,將10,000
行數據插入到books
表,執行上面語句將需要一段時間。
CALL load_book_data(10000);
執行上面語句之後,查看books
表中的數據:
SELECT * FROM books;
最後,使用TRUNCATE TABLE
語句來與DELETE
語句相比執行的速度。
select now() as start_time;
TRUNCATE TABLE books;
select now() as end_time;
上面語句執行結果,如下所示 -
mysql> select now() as start_time;
TRUNCATE TABLE books;
select now() as end_time;
+---------------------+
| start_time |
+---------------------+
| 2017-07-24 21:31:07 |
+---------------------+
1 row in set
Query OK, 0 rows affected
+---------------------+
| end_time |
+---------------------+
| 2017-07-24 21:31:08 |
+---------------------+
1 row in set
可以看到整個過程也就差不多 1
秒鐘完成,下麵再次調用CALL load_book_data(10000);
,完成插入數據後使用DELETE
語句,查看執行的時間 -
select now() as start_time;
DELETE FROM books;
select now() as end_time;
執行上面語句,得到以下結果 -
mysql> select now() as start_time;
DELETE FROM books;
select now() as end_time;
+---------------------+
| start_time |
+---------------------+
| 2017-07-24 21:39:42 |
+---------------------+
1 row in set
Query OK, 10000 rows affected
+---------------------+
| end_time |
+---------------------+
| 2017-07-24 21:39:44 |
+---------------------+
1 row in set
在本教學中,我們向您展示了如何使用MySQL TRUNCATE TABLE
語句從表中有效地刪除所有數據,特別是對於擁有大量數據的表。