有关DML和DLL及delete和truncate的区别

本文深入解析了数据操纵语言DML(如INSERT, UPDATE, DELETE)和数据定义语言DDL(如CREATE, ALTER, DROP)的区别,重点对比了DELETE与TRUNCATE在功能、执行效率、事务处理和资源占用上的差异,适合理解数据库操作的高级特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DML(Data Manipulation Language)数据操纵语言:适用范围:对数据库中的数据进行一些简单操作,如insert,delete,update,select等.

DDL(Data Definition Language)数据定义语言:适用范围:对数据库中的某些对象(例如,database,table)进行管理,如Create,Alter和Drop.

delete和truncate的区别

1、在功能上,truncate是清空一个表的内容,它相当于delete from table_name。
2、delete是dml操作,truncate是ddl操作;因此,用delete删除整个表的数据时,会产生大量的roolback,占用很多的rollback segments, 而truncate不会。
3、在内存中,用delete删除数据,表空间中其被删除数据的表占用的空间还在,便于以后的使用,另外它是“假相”的删除,相当于windows中用delete删除数据是把数据放到回收站中,还可以恢复,当然如果这个时候重新启动系统(OS或者RDBMS),它也就不能恢复了!
而用truncate清除数据,内存中表空间中其被删除数据的表占用的空间会被立即释放,相当于windows中用shift+delete删除数据,不能够恢复!
4、truncate 调整high water mark 而delete不;truncate之后,TABLE的HWM退回到 INITIAL和NEXT的位置(默认)delete 则不可以。
5、truncate 只能对TABLE,delete 可以是table,view,synonym。
6、TRUNCATE TABLE 的对象必须是本模式下的,或者有drop any table的权限 而 DELETE 则是对象必须是本模式下的,或被授予 DELETE ON SCHEMA.TABLE 或DELETE ANY TABLE的权限。
7、在外层中,truncate或者delete后,其占用的空间都将释放。
8、truncate和delete只删除数据,而drop则删除整个表(结构和数据)。

区别

  1.TRUNCATE TABLE是非常快的 
  2.TRUNCATE之后的自增字段从头开始计数了,而DELETE的仍保留原来的最大数值 

  TRUNCATE   TABLE   在功能上与不带   WHERE   子句的   DELETE   语句相同:二者均删除表中的全部行。但   TRUNCATE   TABLE   比   DELETE   速度快,且使用的系统和事务日志资源少。   
DELETE   语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE   TABLE   通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。 
  TRUNCATE   TABLE   删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用   DELETE。如果要删除表定义及其数据,请使用   DROP   TABLE   语句。 
对于由   FOREIGN   KEY   约束引用的表,不能使用   TRUNCATE   TABLE,而应使用不带   WHERE   子句的   DELETE   语句。由于   TRUNCATE   TABLE   不记录在日志中,所以它不能激活触发器。   
  TRUNCATE   TABLE   不能用于参与了索引视图的表。

注意:这里说的delete是指不带where子句的delete语句

 相同点 
  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,再重新导入/插入数据 

引用\[1\]:在功能上,truncate是清空一个表的内容,它相当于delete from table_name。而deletedml操作,truncate是ddl操作;因此,用delete删除整个表的数据时,会产生大量的roolback,占用很多的rollback segments,而truncate不会。\[1\]引用\[2\]:在没有备份情况下,谨慎使用drop与truncate。要删除部分数据行采用delete且注意结合where来约束影响范围。要删除表用drop;若想保留表而将表中数据删除,如果于事务无关,用truncate即可实现。如果事务有关,或想触发trigger,还是用delete。\[2\]引用\[3\]:相同点是truncatedelete都会删除表内的数据,不同点是:1. truncatedelete只删除数据不删除表的结构(定义),而drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger),索引(index);依赖于该表的存储过程/函数将保留,但是变为invalid状态。2. delete语句是dml操作,这个操作会放到rollback segment中,事务提交之后才生效;如果有相应的trigger,执行的时候将被触发。而truncatedrop是ddl操作,操作立即生效,原数据不放到rollback segment中,不能回滚,操作也不触发trigger。3. delete语句不影响表所占用的extent,高水线(high watermark)保持原位置不动,而drop语句将表所占用的空间全部释放,truncate语句缺省情况下将空间释放到minextents个extent,除非使用reuse storage;truncate会将高水线复位(回到最开始)。4. 速度上,一般来说:drop > truncate > delete。5. 安全性上,要小心使用droptruncate,尤其没有备份的时候。如果想删除部分数据行,可以使用delete,并注意带上where子句。回滚段要足够大。如果想删除表,当然可以使用drop。如果想保留表而将所有数据删除,如果事务无关,可以使用truncate。如果事务有关,或者想触发trigger,还是使用delete。\[3\] 所以,deletetruncate的差别主要在以下几个方面: 1. 功能上:truncate相当于delete from table_name,但truncate是ddl操作,而deletedml操作。 2. 影响范围:delete会产生大量的roolback,占用很多的rollback segments,而truncate不会。 3. 数据结构:delete只删除数据,不删除表的结构,而drop语句会删除表的结构依赖的约束、触发器、索引;truncate只删除数据,不删除表的结构。 4. 回滚触发器:delete操作会放到rollback segment中,事务提交之后才生效,并且会触发相应的trigger;而truncatedrop操作立即生效,不放到rollback segment中,也不触发trigger。 5. 空间释放:delete不影响表所占用的extent,高水线保持原位置不动;drop会释放表所占用的全部空间;truncate缺省情况下将空间释放到minextents个extent。 6. 速度:一般来说,drop > truncate > delete。 7. 安全性:使用droptruncate时要小心,尤其没有备份的情况下。如果想删除部分数据行,可以使用delete,并注意带上where子句。如果想删除整个表,可以使用drop。如果想保留表而将所有数据删除,如果事务无关,可以使用truncate。如果事务有关,或者想触发trigger,还是使用delete。 #### 引用[.reference_title] - *1* *3* [deletetruncate区别](https://blog.csdn.net/weixin_42981419/article/details/86162133)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [drop、truncatedelete区别](https://blog.csdn.net/ws0513/article/details/49980547)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值