✅truncate、delete、drop的区别?
典型回答
MySQL数据库中的 TRUNCATE, DELETE, 和 DROP 是用于删除数据的三个不同命令。
DELETE 用于删除表中的一行或多行记录,它可以与 WHERE 子句一起使用来指定要删除的记录。
TRUNCATE 用于快速删除表中的所有记录,并重置任何自增的计数器(如自增的主键)
DROP 用于删除整个表结构及其数据。
这三个操作中,DROP是最彻底的,他不仅删除表中的数据,还删除表结构,并且操作不可撤销。
这三个操作中,DELETE是最慢的,因为他再操作过程中会记录binlog,并且他是在事务中的,可以做回滚。
这三个操作中,DELETE可以和WHERE一起用,可以设置筛选条件,二DROP和TRUNCATE是不可以增加筛选条件的。
这三个操作中,TRUNCATE和DROP是DDL(数据定义语言)操作,二DELETE是DML(数据操作语言)操作。
这三个操作中,DELETE操作删除表中记录后,自增ID不会重置,而TRUNCATE操作则会重新从1开始自增。
| 操作类型 | 删除内容 | 记录日志 | 支持回滚 | 支持where | 速度 | 主键重置 | |
|---|---|---|---|---|---|---|---|
| DELETE | DML | 记录 | Y | Y | Y | 慢 | N |
| TRUNCATE | DDL | 记录 | N | N | N | 快 | Y |
| DROP | DDL | 记录+表结构 | N | N | N | 快 | 表都没了 |
扩展知识
DROP之后有办法恢复吗?
DROP操作非常危险,并且是不可逆的。一旦执行了,数据和表结构就会被立即删除。想要恢复非常困难,可以有以下几个方式,但是不见得一定能100%恢复:
- 数据库备份:如果你定期备份数据库,可以从最近的备份中恢复丢失的表。
- bin log:如果MySQL服务器的二进制日志被启用并且在删除表之前已经记录了所有更改,理论上可以通过这些日志恢复数据。这需要重放日志文件直到删除操作之前的点。
- 数据恢复工具:存在一些专门的数据恢复工具,如 Percona Data Recovery Tool for InnoDB,这些工具可以在某些情况下帮助恢复删除的InnoDB表。但是,这些方法通常技术要求高,且不能保证100%恢复。
- 文件系统备份:如果数据库文件所在的文件系统被备份,那么可以尝试从文件系统备份中恢复整个数据库目录。