truncate ,drop和不带where子句的delete有什么联系与区别?

本文详细对比了SQL中truncate、不带where子句的delete及drop语句的功能与区别,包括它们对表结构的影响、事务处理特性、空间释放方式、执行速度及安全性等方面。

相同点
truncate和不带where子句的delete, 以及drop都会删除表内的数据

不同点:
1. truncate和 delete只删除数据不删除表的结构(定义)
    drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger),索引(index); 依赖于该表的存储过程/函数将保留,但是变为invalid状态.
2.delete语句是dml,这个操作会放到rollback segement中,事务提交之后才生效;如果有相应的trigger,执行的时候将被触发.
   truncate,drop是ddl, 操作立即生效,原数据不放到rollback segment中,不能回滚. 操作不触发trigger.
3.delete语句不影响表所占用的extent, 高水线(high watermark)保持原位置不动
  显然drop语句将表所占用的空间全部释放
  truncate 语句缺省情况下见空间释放到 minextents个 extent,除非使用reuse storage;   truncate会将高水线复位(回到最开始).
4.速度,一般来说: drop>; truncate >; delete
5.安全性:小心使用drop 和truncate,尤其没有备份的时候.否则哭都来不及
使用上,想删除部分数据行用delete,注意带上where子句. 回滚段要足够大.
想删除表,当然用drop
想保留表而将所有数据删除. 如果和事务无关,用truncate即可. 如果和事务有关,或者想触发trigger,还是用delete.
如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据

物联网通信协议测试是保障各类设备间实现可靠数据交互的核心环节。在众多适用于物联网的通信协议中,MQTT(消息队列遥测传输)以其设计简洁低能耗的优势,获得了广泛应用。为确保MQTT客户端服务端的实现严格遵循既定标准,并具备良好的互操作性,实施系统化的测试验证至关重要。 为此,采用TTCN-3(树表结合表示法第3版)这一国际标准化测试语言构建的自动化测试框架被引入。该语言擅长表达复杂的测试逻辑数据结构,同时保持了代码的清晰度可维护性。基于此框架开发的MQTT协议一致性验证套件,旨在自动化地检验MQTT实现是否完全符合协议规范,并验证其Eclipse基金会及欧洲电信标准化协会(ETSI)所发布的相关标准的兼容性。这两个组织在物联网通信领域具有广泛影响力,其标准常被视为行业重要参考。 MQTT协议本身存在多个迭代版本,例如3.1、3.1.1以及功能更为丰富的5.0版。一套完备的测试工具必须能够覆盖对这些同版本的验证,以确保基于各版本开发的设备应用均能满足一致的质量可靠性要求,这对于物联网生态的长期稳定运行具有基础性意义。 本资源包内包含核心测试框架文件、一份概述性介绍文档以及一份附加资源文档。这些材料共同提供了关于测试套件功能、应用方法及可能包含的扩展工具或示例的详细信息,旨在协助用户快速理解并部署该测试解决方案。 综上所述,一个基于TTCN-3的高效自动化测试框架,为执行全面、标准的MQTT协议一致性验证提供了理想的技术路径。通过此类专业测试套件,开发人员能够有效确保其MQTT实现的规范符合性系统兼容性,从而为构建稳定、安全的物联网通信环境奠定坚实基础。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
在 SQL 中,`DROP`、`DELETE` `TRUNCATE` 都用于数据操作,但它们的功能使用场景有明显区别。 ### 功能层面 - **DROP**:用于完全移除数据库对象,如数据表、数据库、视图、存储过程等。执行 `DROP` 操作后,对象及其所有相关的数据结构都会被永久删除,无法通过常规 SQL 语句恢复。例如,删除一个名为 `employees` 的表: ```sql DROP TABLE employees; ``` - **DELETE**:是一种数据操作语言(DML)语句,主要用于从表中删除符合特定条件的行。如果指定条件,则会删除表中的所有行,但表结构依然保留。例如,删除 `employees` 表中 `department` 为 'HR' 的所有行: ```sql DELETE FROM employees WHERE department = 'HR'; ``` - **TRUNCATE**:属于数据定义语言(DDL)语句,用于删除表中的所有行,但保留表结构。 `DELETE` 同,`TRUNCATE` 支持使用 `WHERE` 子句指定删除条件,它会快速清空整个表的数据。例如,清空 `employees` 表的数据: ```sql TRUNCATE TABLE employees; ``` ### 性能层面 - **DROP**:由于要完全移除数据库对象,涉及到释放对象占用的所有存储空间元数据信息,操作开销较大,尤其是对于大表。 - **DELETE**:逐行删除数据,会记录每一行的删除操作到事务日志中,因此对于大表,删除操作可能会比较慢。 - **TRUNCATE**:直接释放表的数据页,记录每一行的删除操作,只记录页的释放,因此速度通常比 `DELETE` 快,尤其是对于大表。 ### 事务层面 - **DROP**:作为 DDL 语句,`DROP` 操作是自动提交的,能回滚。一旦执行,对象就会被永久删除。 - **DELETE**:作为 DML 语句,`DELETE` 操作可以包含在事务中,可以使用 `ROLLBACK` 语句回滚删除操作。 ```sql BEGIN TRANSACTION; DELETE FROM employees WHERE department = 'HR'; -- 如果需要回滚 ROLLBACK; -- 如果确认删除 COMMIT; ``` - **TRUNCATE**:作为 DDL 语句,`TRUNCATE` 操作是自动提交的,能回滚。一旦执行,表中的数据就会被永久删除。 ### 约束索引层面 - **DROP**:删除表时,该表相关的所有约束(如主键、外键、唯一约束等)索引都会被一并删除。 - **DELETE**:删除表中的行会影响表的约束索引。表的结构约束仍然存在,索引也会保持变。 - **TRUNCATE**:清空表中的数据会影响表的约束索引。表的结构约束仍然存在,索引也会保持变,但某些数据库系统(如 SQL Server)会重置自增列的计数器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值