删除表数据drop、truncate和delete的用法

本文深入解析SQL中的三种删除数据的方法:drop、truncate和delete。详细对比了它们在速度、资源消耗、事务处理、数据结构保留及空间释放等方面的差异,帮助读者理解何时使用何种命令。

------drop

出没场合:drop table tb --tb表示数据表的名字,下同

绝招:删除内容和定义,释放空间。简单来说就是把整个表去掉。以后要新增数据是不可能的,除非新增一个表。
例如:一个班class就是一个表,学生就是表中的数据,学生的职务就是定义

drop table class

就是把整个班移除,学生和职务都消失。
比如下面testSchool数据库中有两张表[Classes]表和[Teacher]表
在这里插入图片描述
当执行下面代码之后

drop table Classes

Classes表就被清楚,一干二净! 删除得非常暴力,作为老大实至名归
在这里插入图片描述
-----truncate
出没场合:truncate table tb

绝招:删除内容、释放空间但不删除定义。与drop不同的是,他只是清空表数据而已,他比较温柔。
同样也是一个班,他只去除所有的学生。班还在,职务还在,如果有新增的学生可以进去,也可以分配上职务。

删除内容很容易理解,不删除定义也很容易理解,就是保留表的数据结构。
在这里插入图片描述
上图就表现了:删除内容
在这里插入图片描述
执行语句之后,发现数据表的结构还在,也就是不删除定义
至于释放空间,看下下面两幅图。你们就会明白的
在这里插入图片描述
右图:Id列标识列,因之前delete过行数据,所以会出现标识列不连续(体现了delete删除是不释放空间的)

经过truncate table Teacher 之后,再新增三条数据
在这里插入图片描述
右图:同样Id是标识列,发现插入数据的时候,标识列连续了(体现了truncate删除是释放空间)

注意:truncate 不能删除行数据,要删就要把表清空

-----delete

出没场合:delete table tb --虽然也是删除整个表的数据,但是过程是痛苦的(系统一行一行地删,效率较truncate低)
或 delete table tb where 条件

绝招:删除内容不删除定义,不释放空间。

关于truncate的小小总结:

truncate table 在功能上与不带 WHERE 子句的 delete语句相同:二者均删除表中的全部行。

truncate 比 delete速度快,且使用的系统和事务日志资源少

delete 语句每次删除一行,并在事务日志中为所删除的每行记录一项。所以可以对delete操作进行roll back。

1、truncate 在各种表上无论是大的还是小的都非常快。如果有ROLLBACK命令Delete将被撤销,而 truncate 则不会被撤销。

2、truncate 是一个DDL语言,向其他所有的DDL语言一样,他将被隐式提交,不能对 truncate 使用ROLLBACK命令

3、truncate 将重新设置高水平线和所有的索引。在对整个表和索引进行完全浏览时,经过 truncate 操作后的表比Delete操作后的表要快得多。

4、truncate 不能触发任何Delete触发器

5、当表被清空后表和表的索引将重新设置成初始大小,而delete则不能。

6、不能清空父表

### SQL 中 `DROP`、`TRUNCATE` `DELETE` 的区别及使用场景 #### 执行速度比较 从执行速度的角度来看,三者的顺序通常是:`DROP > TRUNCATE >> DELETE`[^1]。 --- #### 功能区分 ##### 1. **`DROP`** - **功能**: 删除整个数据库对象(如视图、索引等),包括结构、数据以及与之关联的权限约束。 - **特点**: - 数据库对象被完全移除,不可逆。 - 不会触发任何触发器,因为它作用于结构而非数据。 - 执行速度非常快,因为直接删除及其所有相关内容。 - **语法**: ```sql DROP TABLE table_name; ``` - **适用场景**: 当需要彻底删除某个及其所有内容时使用。例如,在开发阶段清理不再需要的测试[^4]。 --- ##### 2. **`TRUNCATE`** - **功能**: 清空中的所有数据,但保留的结构(列定义、约束等)。 - **特点**: - 类似于无条件的 `DELETE` 操作,但它不会逐行删除,而是重新分配数据页,因此效率更高。 - 不支持带有外键约束的,除非先解除这些约束。 - 不会产生大量的事务日志记录,适合大规模数据清除。 - 不允许回滚操作。 - **语法**: ```sql TRUNCATE TABLE table_name; ``` - **适用场景**: 需要快速清空中所有数据而不需要保留旧数据的情况下使用。例如,在批量导入新数据前清空现有数据[^3]。 --- ##### 3. **`DELETE`** - **功能**: 删除中的特定行或所有行,具体取决于是否提供了 `WHERE` 条件。 - **特点**: - 支持有条件地删除指定行。 - 每次删除一行都会记录到事务日志中,便于回滚操作。 - 可能会影响性能,尤其是当涉及大量数据时。 - 如果未提供 `WHERE` 子句,则效果类似于 `TRUNCATE`,但由于逐行处理,速度较慢。 - **语法**: ```sql DELETE FROM table_name WHERE condition; -- 或者删除所有行: DELETE FROM table_name; ``` - **适用场景**: 需要基于某些条件删除部分数据或者希望保留事务日志以便回滚时使用。例如,定期清理过期的日志记录[^5]。 --- ### 总结对比格 | 特性 | `DROP` | `TRUNCATE` | `DELETE` | |---------------------|----------------------------------|----------------------------------|----------------------------------| | **目标** | 整个 | 中的所有数据 | 中的部分或全部数据 | | **速度** | 最快 | 较快 | 最慢 | | **日志记录** | 无 | 少 | 多 | | **回滚能力** | 不可回滚 | 不可回滚 | 可回滚 | | **触发器影响** | 不触发 | 不触发 | 触发 | | **适用范围** | 彻底删除 | 快速清空数据 | 精确控制删除 | --- ### 使用注意事项 - 对于生产环境下的敏感数据操作,建议谨慎评估后再决定采用哪种方法。 - 在使用 `TRUNCATE` 或 `DROP` 之前,务必确认已备份重要数据,以免造成不可挽回的损失。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值