【Mysql】truncate 和 delete的区别
- 【一】删除内容
- 【二】执行速度
- 【三】事务日志记录
- 【四】回滚
- 【五】触发器
- 【六】外键约束
- 【七】锁定
- 【八】使用场景
- 【九】总结
- 【1】truncate
- 【2】drop
- 【3】delete
【一】删除内容
(1)TRUNCATE TABLE:删除表中的所有行,但保留表结构和其元数据、索引等。
(2)DELETE:根据WHERE子句的条件删除表中的行。如果没有指定WHERE子句,那么将删除表中的所有行。
【二】执行速度
(1)TRUNCATE:通常比DELETE更快,因为它是数据库引擎级别的操作,不需要逐行处理。
(2)DELETE:是SQL级别的操作,可能需要逐行检查并删除符合条件的记录。
【三】事务日志记录
(1)TRUNCATE:通常不记录在事务日志中,因为它是一个不可逆的操作,用于快速清理表。
(2)DELETE:操作记录在事务日志中,因为它是一个可逆的操作,可以通过事务回滚来撤销。
【四】回滚
(1)TRUNCATE:操作不可回滚,一旦执行,无法恢复删除的数据。
(2)DELETE:操作可以回滚,如果操作是在事务中执行的,可以在事务失败时撤销。
【五】触发器
(1)TRUNCATE:不触发与行相关的任何触发器。
(2)DELETE:操作会触发与行相关的BEFORE DELETE和AFTER DELETE触发器。
【六】外键约束
(1)TRUNCATE:操作在有外键约束的情况下,如果外键引用了要删除的行,操作将失败。
(2)DELETE:操作在有外键约束的情况下,可以逐行处理外键引用,可能需要级联删除。
【七】锁定
(1)TRUNCATE:操作通常需要更高的锁定级别,因为它是一个批量操作,可能会锁定整个表。
(2)DELETE:操作可能只需要锁定相关的行,特别是如果使用行级锁定的数据库系统。
【八】使用场景
(1)TRUNCATE:通常用于快速清理表,特别是当表中的数据不再需要,并且可以重新填充时。
(2)DELETE:通常用于根据特定条件删除数据,或者在需要事务支持和可回滚性的场景中。
【九】总结
【1】truncate
(1)truncate会删除表中的所有数据、释放空间,但是保留表结构
(2)只能操作表,不能与where一起使用
(3)truncate删除操作立即生效,原数据不放到rollback segment中,不能rollback,操作不触发trigger
(4)truncate删除数据后会释放表空间、重置Identity(标识列、自增字段),相当于自增列会被置为初始值,又重新从1开始记录、而非接着原来的id数
(5)truncate删除数据后不写服务器log,整体删除速度快
【2】drop
drop table table_name;
drop table if exists table_name;
(1)drop会删除整个表,包括表结构和数据,释放空间
(2)立即执行,执行速度最快
(3)不可回滚
【3】delete
#删除部分数据
delete from tb_name where clause;#清空表,仅删除数据、保留表结构,同时也不释放表空间
delete from tb_name;
(1)删除表中数据而不删除表结构,也不释放空间
(2)delete可以删除一行、多行、乃至整张表
(3)每次删除一行,都在事务日志中为所删除的每行记录一项,可回滚
(4)如果不加where条件,表示删除表中所有数据,仅删除数据、保留表结构,同时也不释放表空间