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 #临时表 
 
 
posted @   qanholas  阅读(285)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
点击右上角即可分享
微信分享提示