在本教學中,您將學習如何使用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
動作,則子表中的相應行也將被刪除。TRUNCATE TABLE
將逐個刪除行,並且遇到由子表中的行參照的行時,它將停止併行出錯誤。TRUNCATE TABLE
語句將刪除該表並重新建立一個具有相同結構的新表,這比使用DELETE
語句特別是對於大表更快更有效。如果您使用其他儲存引擎,則TRUNCATE TABLE
語句將刪除並重新建立一個新錶。
請注意,如果表具有
AUTO_INCREMENT
列,則TRUNCATE TABLE
語句將自動遞增值重置為零。
此外,TRUNCATE TABLE
語句不使用DELETE
語句,因此與表關聯的DELETE觸發器將不被呼叫。
首先,建立一個名為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
語句從表中有效地刪除所有資料,特別是對於擁有大量資料的表。