MySQL之TRUNCATE TABLE
TRUNCATE TABLE完全清空一個(gè)表。它需要DROP特權(quán)。
從邏輯上講,TRUNCATE TABLE類似于刪除所有行的DELETE語句,或類似于DROP TABLE和CREATE TABLE語句的序列。為了獲得高性能,它繞過了刪除數(shù)據(jù)的DML方法。因此,它不能回滾,也不會觸發(fā)ON DELETE觸發(fā)器,并且不能對具有父子外鍵關(guān)系的InnoDB表執(zhí)行。
盡管TRUNCATE TABLE與DELETE相似,但它被分類為DDL語句而不是DML語句。它與DELETE在以下方面有所不同:
截?cái)嗖僮骺蓜h除并重新創(chuàng)建表,這比一一刪除行要快得多,特別是對于大型表。
截?cái)嗖僮鲿?dǎo)致隱式提交,因此無法回滾。(區(qū)別:SQL Server中,TRUNCATE TABLE是可以回滾數(shù)據(jù)的)
如果會話持有活動表鎖,則無法執(zhí)行截?cái)嗖僮鳌?/p>
如果存在其他引用該表的表的FOREIGN KEY約束,則InnoDB表或NDB表的TRUNCATE TABLE失敗。允許在同一表的列之間使用外鍵約束。
截?cái)嗖僮鞑粫閯h除的行數(shù)返回有意義的值。通常的結(jié)果是“受影響的0行”,應(yīng)解釋為“無信息”。
只要表格式文件tbl_name.frm有效,就可以使用TRUNCATE TABLE將表重新創(chuàng)建為空表,即使數(shù)據(jù)或索引文件已損壞。
任何AUTO_INCREMENT值都將重置為其初始值。即使對于MyISAM和InnoDB,也是如此,它們通常不重用序列值。
與分區(qū)表一起使用時(shí),TRUNCATE TABLE保留分區(qū);也就是說,數(shù)據(jù)和索引文件將被刪除并重新創(chuàng)建,而分區(qū)定義(.par)文件不受影響。
TRUNCATE TABLE語句不調(diào)用ON DELETE觸發(fā)器。
