• drop,delete 和 truncate


    相同点: 
    truncate 和不带 where 子句的 delete,以及 drop 都会删除表内的数据  
     
    不同点: 
     
    1. truncate 和 delete 只删除数据不删除表的结构(定义)  
      drop 语句将删除表的结构被依赖的约束(constrain)、触发器(trigger)、索引(index);依赖于该表的存储过程/函数将保留,但是变为 invalid 状态。 
     
    2delete 语句是数据库操作语言(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,再重新导入/插入数据。 
     
    通俗的讲: 
     
    在实际应用中,三者的区别是明确的。 
     
    当你不再需要该表时, 用 drop
     
    当你仍要保留该表,但要删除所有记录时, 用 truncate; 
     
    当你要删除部分记录时(always with a WHERE clause), 用 delete 
     
    --------------------------------- 
    上面是sql联机丛书上说的,似乎很少有书提到truncate table,也似乎很少用到它。今天看到一个问题则正是需要它。 
    问题:有一个拥有1亿条数据的表,只需要保留其中的5条,其他删除,如何做?  
     
    这就需要用truncate table来搞定了,如下: 
    select 5条数据 into #临时表 from 1亿条数据的牛X表 
     
    truncate table 1亿条数据的牛X表 
    --让它牛X,不到10毫秒干掉它。 
     
    insert 1亿条数据的牛X表 select * from #临时表 
     
    drop table #临时表 
     
     
  • 相关阅读:
    java多线程--线程和线程池
    java多线程--锁学习
    vue项目中使用iconfont
    组件封装-无数据组件
    添加自定义字体
    时间格式化(自定义格式)
    深度克隆方法
    LazyMan面试题
    lodash.throttle实现节流
    第6章:关系数据库理论(考研重点)
  • 原文地址:https://www.cnblogs.com/qanholas/p/1860776.html
Copyright © 2020-2023  润新知