数据库——SQL中delete,truncate和drop的区别

来源:互联网 发布:数字照度计软件 编辑:程序博客网 时间:2024/06/05 12:39

相同点:

1.不带where子句的delete、truncate和drop都会删除表内的所有数据。

2.drop、truncate都是DDL语句,执行后会自动提交。

不同点:

1. truncate和delete 只删除数据,表结构不变;

    drop会删除整个表(包括表结构),drop将删除表的结构被依赖的约束(constrain),触发器(trigger)和索引(index),依赖于该表     的存储过程/函数将保留,但变为无效状态。

2. delete 属于DML,该操作会放到 rollback segment 中,事务提交之后才生效,可回滚,若有相应的 trigger,执行的时候将被触发;

    truncate、drop 属于DDL,操作立即生效,原数据不放到 rollback segment 中,不能回滚,操作不触发 trigger。

3. delete 操作不会减少表或索引所占空间;

    truncate 会将该表和索引所占空间恢复到初始大小;

    drop 语句将表所占用的空间全部释放。

4.速度,一般来说: drop> truncate > delete

5.使用范围:truncate只能对table,delete可对table和view

6.安全性:小心使用 drop 和 truncate,尤其没有备份的时候.

  使用上,想删除部分数据行用 delete,注意带上where子句. 回滚段要足够大; 

  想删除表,当然用 drop;

  想保留表而将所有数据删除,若与事务无关,用truncate,若与事务有关,或者想触发trigger,用delete。

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

7.对于由foreign key约束引用的表,不能用truncate,而应使用不带where的delete,由于truncate不记录在日志中,无法激活触发器。

8.delete需手动commit提交才会生效,可通过rollback撤销,且不影响表所占用的extent,高水线(high watermark)保持原位置不变;

   truncate会删除表中所有记录,并且将重新设置高水线和所有的索引,缺省情况下将空间释放到minextentsextent,除非用reuse storage,不   会记录日志。


Truncate  table  表名” 速度快且效率高的原因:

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

       但truncate tabledelete速度快,且使用的系统和事务日志资源少。delete语句每次删除一行,并在事务日志中为所删除的每行记录        一项。truncate table通过释放存储表数据所用的数据页来删除数据,只在事务日志中记录页的释放。 


原创粉丝点击