一、delete

  1、delete是DML,执行delete操作时,每次从表中删除一行,并且同时将该行的的删除操作记录在redo和undo表空间中以便进行回滚(rollback)和重做操作,但要注意表空间要足够大,需要手动提交(commit)操作才能生效,可以通过rollback撤消操作。

  2、delete可根据条件删除表中满足条件的数据,如果不指定where子句,则删除表中所有记录。

  3、delete语句不影响表所占用的extent,高水线(high watermark)保持原位置不变。

二、truncate

  1、truncate是DDL,会隐式提交,所以不能回滚,不会触发触发器。

  2、truncate会删除表中所有记录,并且将重新设置高水线和所有的索引,缺省情况下将空间释放到minextents个extent,除非使用reuse storage。不会记录日志,所以执行速度很快,但不能通过rollback撤消操作(如果一不小心把一个表truncate掉,也是可以恢复的,只是不能通过rollback来恢复)。

  3、对于外键(foreignkey )约束引用的表,不能使用 truncate table,而应使用不带 where 子句的 delete 语句。

  4、truncatetable不能用于参与了索引视图的表。

三、drop

  1、drop是DDL,会隐式提交,所以,不能回滚,不会触发触发器。

  2、drop语句删除表结构及所有数据,并将表所占用的空间全部释放。

  3、drop语句将删除表的结构所依赖的约束,触发器,索引,依赖于该表的存储过程/函数将保留,但是变为invalid状态。

四、drop、truncate和delete的区别

  1、DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作。TRUNCATE TABLE 则一次性地从表中删除所有的数据并不把单独的删除操作记录记入日志保存,删除行是不能恢复的。并且在删除的过程中不会激活与表有关的删除触发器,执行速度快。

  2、表和索引所占空间。当表被TRUNCATE 后,这个表和索引所占用的空间会恢复到初始大小,而DELETE操作不会减少表或索引所占用的空间。drop语句将表所占用的空间全释放掉。

  3、一般而言,执行速度drop > truncate > delete

  4、  应用范围:TRUNCATE 只能对TABLE;DELETE可以是table和view。

  5、TRUNCATE 和DELETE只删除数据,而DROP则删除整个表(结构和数据)。

  6、  delete语句为DML(data maintain Language),这个操作会被放到 rollback segment中,事务提交后才生效。如果有相应的 tigger,执行的时候将被触发。

  7、   truncate、drop是DLL(data define language),操作立即生效,原数据不放到 rollback segment中,不能回滚。

  8、 在没有备份情况下,谨慎使用 drop 与 truncate。要删除部分数据行采用delete且注意结合where来约束影响范围。回滚段要足够大。要删除表用drop。若想保留表而将表中数据删除,如果于事务无关,用truncate即可实现;如果和事务有关,或老师想触发trigger,还是用delete。

  9、Truncate table 表名 速度快而且效率高,因为:truncate table 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。

  10、 TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的初始值。如果想保留标识计数值,请改用 DELETE。如果要删除表定义及其数据,请使用 DROP TABLE 语句。

  11、 对于由 FOREIGN KEY 约束引用的表,不能使用 TRUNCATE TABLE,而应使用不带 WHERE 子句的 DELETE 语句。由于 TRUNCATE TABLE 不记录在日志中,所以它不能激活触发器。

五、总结

  1、在速度上,一般来说,drop> truncate > delete。

  2、在使用drop和truncate时一定要注意,虽然可以恢复,但为了减少麻烦,还是要慎重。

  3、如果想删除部分数据用delete,注意带上where子句,回滚段要足够大;

  如果想删除表,当然用drop;

  如果想保留表而将所有数据删除,如果和事务无关,用truncate即可;

   如果和事务有关,或者想触发trigger,还是用delete;

  如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据。

参考:

  https://blog.csdn.net/ws0513/article/details/49980547

  https://www.cnblogs.com/dekevin/archive/2012/07/22/2604049.html

drop、truncate、delete功能介绍和三者间区别的更多相关文章

  1. drop,truncate,delete 区别

    一.SQL中的语法 1.drop table 表名称                         eg: drop table  dbo.Sys_Test   2.truncate table 表 ...

  2. mysql----快速删除数据表(drop,truncate.delete)

    概念: 三者均可删除数据表 TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:二者均删除表中的全部行.但 TRUNCATE TABLE 比 DELETE 速度快 ...

  3. 删除表的语句(drop truncate delete)

    p.p1 { margin: 0; font: 12px ".PingFang SC" } p.p2 { margin: 0; font: 12px "Helvetica ...

  4. drop、delete和truncate三者的区别

    相同点:1.truncate和不带where子句的delete.以及drop都会删除表内的数据.2.drop.truncate都是DDL语句(数据定义语言),执行后会自动提交.不同点:1. trunc ...

  5. 数据库中删除语句Drop、Delete、Truncate的相同点和不同点的比较

    数据库删除语句的分别介绍: Delete:用于删除表中的行(注:可以删除某一行:也可以在不删除表的情况下(即意味着表的结构.属性.索引完整)删除所有行) 语法:删除某一行:Delete From 表名 ...

  6. sql 删除表格delete drop truncate 区别(转)

    (1)   DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作.TRUNCATE TABLE 则一次性地从表中删除所有的数据并不把 ...

  7. MySQL drop、delete和truncate的区别

    注意:这里说的delete是指不带where子句的delete语句 相同点 truncate和不带where子句的delete, 以及drop都会删除表内的数据 不同点: 1. truncate和 d ...

  8. (转)iOS sqlite :truncate/delete/drop区分

    转自:http://blog.sina.com.cn/s/blog_6755689f0101fofb.html 相同点: 1.truncate和不带where子句的delete.以及drop都会删除表 ...

  9. drop,truncate与delete的区别

    注意:这里说的delete是指不带where子句的delete语句 相同点 truncate和不带where子句的delete, 以及drop都会删除表内的数据 不同点: 1. truncate和 d ...

随机推荐

  1. Dicom文件基本操作

    官方文档 网址:https://github.com/fo-dicom/fo-dicom托管在github上. 官方例子 Dicom文件基本操作 var file = DicomFile.Open(@ ...

  2. 雪碧图——CSS Sprites(精灵)

    在日常开发打开文件包,打开static文件夹,有一张图片,里面融合了这个应用都会用到的小图标,其实,主要是减少应用渲染出现繁多的请求,加速页面渲染. 解决方案:使用css背景定位 icon {widt ...

  3. 32,初探c++标准库

    1. 有趣的重载 (1)操作符<<:原义是按位左移,重载“<<”可将变量或常量左移到对象中 重载左移操作符(仿cout类) #include<stdio.h> co ...

  4. 感性认识JWT

    常见的认证机制 今天我么聊一聊JWT. 关于JWT,相信很多人都已经看过用过,他是基于json数据结构的认证规范,简单的说就是验证用户登没登陆的玩意.这时候你可能回想,哎哟,不是又那个session么 ...

  5. state实例

    States是SaltStack中的配置语言,在日常进行配置管理时需要编写大量的States文件. 比如我们需要安装一个包,然后管理一个配置文件,最后保证某个服务正常运行. 这里就需要我们编写一些st ...

  6. Day01_mongoDB入门

    学于黑马和传智播客联合做的教学项目 感谢 黑马官网:http://www.itheima.com 传智播客官网:http://www.itcast.cn 微信搜索"艺术行者",关注 ...

  7. PHP array_fill() 函数

    ------------恢复内容开始------------ 实例 用给定的键值填充数组: <?php$a1=array_fill(3,4,"blue");print_r($ ...

  8. loj #6247. 九个太阳 k次单位根 神仙构造 FFT求和原理

    LINK:九个太阳 不可做系列. 构造比较神仙. 考虑FFT的求和原理有 \(\frac{1}{k}\sum_{j=0}^{k-1}(w_k^j)^n=[k|n]\) 带入这道题的式子. 有\(\su ...

  9. JavaWeb项目的部署以及远程调试

    Linux环境下软件的安装 Linux环境下的程序的安装.更新.卸载和查看. rpm 命令:相当于windows程序的添加/卸载程序,进程程序的安装,查看,卸载. 本地程序安装:rpm -ivh 程序 ...

  10. day18.os模块 对系统进行操作

    一.os操作 1.system()在python中执行系统命令 # os.system("ifconfig") # os.system("touch 1.txt" ...