Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > mysql  truncate、delete、drop区别

MySQL 中 truncate、delete、drop的区别详解

作者:云计算

本文详细解析了MySQL中三种删除方式——DELETE、TRUNCATE和DROP的核心区别,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧

DELETETRUNCATEDROP 是 MySQL 中三种删除数据的方式,核心区别如下:

对比维度DELETETRUNCATEDROP
SQL 类型DML(数据操作语言)DDL(数据定义语言)DDL(数据定义语言)
删除内容表中的数据行表中的所有数据表结构 + 数据 + 索引
WHERE 条件✅ 支持❌ 不支持❌ 不支持
事务回滚✅ 支持(需在事务中)❌ 不支持❌ 不支持
触发器✅ 触发 AFTER/BEFORE❌ 不触发❌ 不触发
自增 ID不重置✅ 重置为初始值表都没了
执行速度慢(逐行删除)快(直接清空)最快(直接删除)
空间释放不释放,可复用✅ 释放页空间✅ 全部释放
外键约束受约束限制需要先删除外键级联删除

一句话总结DELETE 是逐行删除、可回滚;TRUNCATE 是整表清空、不可回滚、重置自增;DROP 是连表带数据一起删除。

深度解析

一、执行机制对比

上图展示了三种删除方式的执行机制差异:

二、事务与回滚机制

关键差异

重要提示:生产环境中 TRUNCATE 和 DROP 是高危操作,执行前务必确认数据已备份!

三、自增 ID 处理差异

-- 测试表:当前最大 ID 为 5
CREATE TABLE test (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50)
);
INSERT INTO test (name) VALUES ('A'), ('B'), ('C'), ('D'), ('E');
-- 此时 AUTO_INCREMENT = 6
-- 场景一:使用 DELETE 删除
DELETE FROM test;  -- 删除所有数据
INSERT INTO test (name) VALUES ('F');
-- id = 6(自增 ID 不重置,继续递增)
-- 场景二:使用 TRUNCATE 删除
TRUNCATE TABLE test;  -- 清空表
INSERT INTO test (name) VALUES ('F');
-- id = 1(自增 ID 重置为初始值)

总结

四、性能对比

性能结论

五、使用场景选择

-- ✅ 场景一:删除部分数据,需要条件过滤
DELETE FROM orders WHERE create_time < '2023-01-01';
-- ✅ 场景二:删除数据后可能需要回滚
BEGIN;
DELETE FROM temp_table WHERE status = 0;
-- 检查结果...
ROLLBACK;  -- 或者 COMMIT
-- ✅ 场景三:清空大表,重置自增 ID,不需要回滚
TRUNCATE TABLE log_table;
-- ✅ 场景四:彻底删除表(包括结构和数据)
DROP TABLE deprecated_table;
-- ✅ 场景五:删除表但保留表结构
TRUNCATE TABLE user_temp;  -- 推荐
-- 或者
DELETE FROM user_temp;     -- 如果需要回滚

六、安全操作建议

-- ❌ 危险操作:生产环境禁止直接执行
TRUNCATE TABLE orders;     -- 数据无法恢复!
DROP TABLE users;          -- 表直接没了!
-- ✅ 安全操作:先备份再删除
-- 步骤 1:创建备份表
CREATE TABLE orders_backup_20240101 AS SELECT * FROM orders;
-- 步骤 2:确认备份无误
SELECT COUNT(*) FROM orders_backup_20240101;
-- 步骤 3:执行删除
TRUNCATE TABLE orders;
-- ✅ 更安全的做法:使用事务 + DELETE(小数据量)
BEGIN;
DELETE FROM orders WHERE create_time < '2023-01-01';
-- 检查影响行数
SELECT ROW_COUNT();
-- 确认无误后提交
COMMIT;
-- 或者回滚
ROLLBACK;

面试高频追问

到此这篇关于MySQL 中 truncate、delete、drop的区别详解的文章就介绍到这了,更多相关mysql truncate、delete、drop区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文