首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 清空資料表完整對比:TRUNCATE vs DELETE 深度解析

     編輯:MySQL 資料庫相關知識

語法速查

TRUNCATE TABLE table_name;
DELETE FROM table_name;

實戰演示

-- 建表
CREATE TABLE test_del (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20));
CREATE TABLE test_trunc (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20));

-- 插入 7 筆
INSERT INTO test_del (name) VALUES ('a'),('b'),('c'),('d'),('e'),('f'),('g');
INSERT INTO test_trunc (name) VALUES ('a'),('b'),('c'),('d'),('e'),('f'),('g');

-- 清空
DELETE FROM test_del;
TRUNCATE TABLE test_trunc;

-- 重新插入
INSERT INTO test_del (name) VALUES ('a'),('b'),('c'),('d'),('e'),('f'),('g');
INSERT INTO test_trunc (name) VALUES ('a'),('b'),('c'),('d'),('e'),('f'),('g');

-- 結果對比
SELECT * FROM test_del;   -- id 從 8 開始
SELECT * FROM test_trunc; -- id 從 1 開始

核心差異對比表

維度DELETETRUNCATE
屬性DML (Data Manipulation Language)DDL (Data Definition Language)
執行方式逐行刪除,記錄 undo log釋放數據頁,重建表結構
速度慢(大表極慢)極快(元數據操作)
AUTO_INCREMENT保留最大值+1重置為 1
觸發器激活 BEFORE/AFTER DELETE不激活
回滾支援 (事務中)不支援 (隱含提交)
WHERE 條件支援不支援
鎖粒度行鎖表鎖 (元數據鎖)
Binlog 記錄行級記錄每行語句級記錄 (或不記錄)
外鍵約束檢查引用完整性被引用表不可 TRUNCATE
權限需求DELETE 權限DROP 權限

選擇指南

  • 全表清空、重置自增、不需觸發器、大表 → TRUNCATE
  • 需保留自增值、需觸發器、需回滾、條件刪除、被外鍵引用 → DELETE
  • InnoDB 大表 TRUNCATE 5.5+ 快速釋放空間,5.6+ 可線上執行不阻塞 DML

進階:DELETE 大表分批清空

WHILE (SELECT COUNT(*) FROM big_table) > 0 DO
  DELETE FROM big_table WHERE id <= (SELECT MIN(id) FROM big_table) + 999;
  DO SLEEP(0.1);
END WHILE;

理解本質差異,根據業務語義選擇正確工具,避免「清空表卻沒重置自增」或「大表 DELETE 卡死主庫」等生產事故。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved