Oracle delete truncate drop 的区别

1. delete/truncate 只删除数据不删除表,索引的结构。 drop 将删除表的结构及依赖的 index/constrain/trigger,依赖于该表的 procedure/function 将保留,但是变为 invalid 状态;

 

2. delete 是 dml,写 rollback segement,可回滚,速度慢,事务提交之后才生效。在 9i 满足 undo_retention 条件下可使用 flashback。一次性大批量数据的 delete 可能导致回滚段急剧扩展从而影响到数据库,慎用,触发 trigger。 truncate/drop 是 ddl,隐式提交,不写 rollback segment,不能回滚,速度快。9i 不能使用 flashback,不触发 trigger;

3. delete 不影响表所占用的 extent,HWM 保持原位置不动,即使删除的是最靠近 HWM 的数据。delete 其实也可以释放空间,但是不降低 HWM,delete 后 block 的空闲空间达到 pct_used,就可以重用。 truncate 缺省情况下将空间(表和索引)释放到 minextents 个 extent,除非使用 reuse storage。truncate 会将高水线复位(回到最开始)。 drop 将表所占用的空间全部释放,segment 不存在,无所谓 HWM 的概念;

Oracle 高水位(HWM) 

http://blog.youkuaiyun.com/tianlesoftware/archive/2009/10/22/4707900.aspx         

   

4. truncate/drop 的对象必须是本模式下的,或者被授予 drop any table 的权限,但 drop any table 权限不能 truncate/drop sys 的表。 delete 的对象必须是本模式下的,或者被授予 delete on SCHEMA.table 或 delete any table 的权限,但 delete any table 权限不能 delete sys 的表;

5. 不能 truncate 一个带有 enable 外键的表,不管表里有没有数据,如果要 truncate,首先要 disable 外键或者删除外键(drop 外键的表肯定是删除了外键)。不能 drop 一个带有 enable 外键的表,不管表里有没有数据,如果要 drop,首先要删除外键,或者直接用 drop table TABLE_NAME cascade constraints; 级联删除外键。 delete 可以。

 

转载自网络

------------------------------------------------------------------------------ 

Blog: http://blog.youkuaiyun.com/tianlesoftware 

网上资源: http://tianlesoftware.download.youkuaiyun.com 

相关视频:http://blog.youkuaiyun.com/tianlesoftware/archive/2009/11/27/4886500.aspx 

DBA1 群:62697716(满); DBA2 群:62697977

  

<think>首先,用户的问题是关于Oracle数据库中`truncate`和`drop`命令的区别。我的回答需要参考之前提供的引用资料,特别是引用[1]、[2]和[3],因为它们专门讨论了`delete`、`truncate`和`drop`的区别。由于用户指定了只关心`truncate`和`drop`,我会聚焦于此。关键点从引用中提取:-引用[1]:-`truncate`和`drop`都会删除表内的数据。-`truncate`只删除数据,不删除表的结构。-`drop`删除表的结构和所有相关对象。-`drop`是DDL,立即生效,无法回滚。-`truncate`是DDL,删除速度快。-引用[2]:-`truncate`删除数据但保留表结构。-`drop`删除表结构和数据。-`truncate`删除的数据不能恢复。-`drop`彻底删除表。-引用[3]:-`truncate`一次性删除数据,隐式提交,不能恢复。-`drop`删除数据和结构。-速度上:`drop`>`truncate`>`delete`。用户之前有一个问题关于恢复`drop`删除的表数据,但现在这个是新问题,所以我需要确保回答只针对区别。回答结构:-由于是系统级指令,我必须使用$...$或$$...$$格式处理公式(虽然这个主题可能不需要数学公式,但如果涉及任何表达式,我会注意)。-独立公式必须使用$$...$$。-使用中文回答。-在回答末尾生成相关问题。-引用的段落末尾自然地添加引用标识,例如[^1]。用户的问题:"我想了解Oracle数据库中truncatedrop命令的区别请问Oracle数据库truncatedrop命令的区别"所以,我需要清晰地比较两者。大纲回答:1.**介绍两者**:解释什么是`truncate`和`drop`。2.**核心区别**:-对表的影响:`truncate`保留表结构,只删除数据;`drop`删除整个表结构。-数据删除方式:`truncate`快速删除;`drop`彻底删除。-可恢复性:`truncate`删除的数据一般不可恢复(除非有备份);`drop`删除后,表数据和结构都无法恢复(除非使用闪回或恢复方法)。-操作类型:两者都是DDL(数据定义语言)。-速度:`drop`比`truncate`更快。3.**适用场景**:举例说明何时使用`truncate`,何时使用`drop`。4.**注意事项**:强调安全性和备份。确保参考引用:-引用[1]中提到:`truncate`不删除表结构,`drop`删除表结构;`truncate`重置高水位线;速度差异。-引用[2]:`truncate`一次性删除数据;`drop`删除表。-引用[3]:区别总结。在我的回答中,引用内容时添加[^n]。回答格式:-结构清晰:用标题或段落分割。-没有代码块,但可以描述。-末尾添加相关问题。相关问题生成:基于主题,生成3个相关问题,如关于使用场景、恢复方法等。最终回答用中文。</think> ### Oracle数据库中TRUNCATEDROP命令的区别Oracle数据库中,`TRUNCATE`和`DROP`都是用于删除数据的命令,但它们在行为、适用场景和影响上存在显著差异。这些区别基于它们对表结构和数据的处理方式、操作的不可逆性以及性能表现。以下是对两者的详细对比分析,内容参考了相关技术文档和最佳实践。 #### 1. **核心功能与操作对象** - **`TRUNCATE`命令**: 此命令仅删除表中的所有数据行,但**保留表的完整结构**(包括表定义、列、索引和触发器等)。例如: ```sql TRUNCATE TABLE employee; -- 删除employee表中的所有数据,但表结构不变 ``` 删除后,表的占用空间会恢复到初始状态(高水位线被重置),相当于清空表但保留其“骨架”$^{(1)}$[^1]。 - **`DROP`命令**: 此命令**完全删除整个表及其相关结构**,包括表定义、数据、索引、触发器、约束等。表本身在数据库中不复存在$^{(2)}$[^2]。例如: ```sql DROP TABLE employee; -- 删除employee表,包括所有数据和结构 ``` 删除后,表所占用的所有空间被释放,且无法直接访问$^{(2)}$[^2]。 #### 2. **操作性质与事务处理** - **`TRUNCATE`**: 是DDL(Data Definition Language)命令,操作**立即生效且无法回滚**(因为它不写入回滚段)。这意味着执行`TRUNCATE`后,数据无法通过`ROLLBACK`恢复$^{(1)}$[^1]。同时,它不触发与表相关的触发器$^{(3)}$[^3]。 - **`DROP`**: 同样是DDL命令,操作**立即生效且不可回滚**。删除表后,所有依赖对象(如存储过程)变为无效状态$^{(1)}$[^1]。与`TRUNCATE`类似,它也不触发触发器$^{(3)}$[^3]。 #### 3. **数据删除方式与性能** - **删除速度**: `DROP`通常比`TRUNCATE`更快,因为它直接释放整个表所占用的资源空间$^{(1)(3)}$[^1][^3]。 速度比较: $$ \text{DROP} > \text{TRUNCATE} > \text{DELETE} $$ 其中: - `DROP`直接移除元数据$^{(3)}$[^3]。 - `TRUNCATE`仅移除数据块$^{(1)}$[^1]。 - **空间管理**: - `TRUNCATE`:删除数据后,表空间恢复到初始大小(如`MINEXTENTS`参数设置),高水位线复位到零$^{(1)}$[^1]。 - `DROP`:释放所有相关空间,包括表和索引所占的区域$^{(1)(2)}$[^1][^2]。 #### 4. **可恢复性与安全性** - **可恢复性**: - `TRUNCATE`删除的数据**不可恢复**(除非有备份或使用时间点恢复)$^{(2)}$[^2]。 - `DROP`删除的表**完全不可访问**,但可通过Oracle的`FLASHBACK TABLE`(如果启用回收站)或PITR(Point-in-Time Recovery)恢复表结构和数据$^{(1)}$[^1]。 例如:$$ \text{FLASHBACK TABLE employee TO BEFORE DROP;} $$ - **安全风险**: 两者均不生成事务日志,易导致数据永久丢失。因此,操作前必须确保有备份: - `TRUNCATE`适用于快速清理测试环境或数据过期的表。 - `DROP`应在表不再需要时使用$^{(1)(3)}$[^1][^3]。 #### 5. **适用场景建议** - **使用`TRUNCATE`的场景**: - 需要保留表结构但彻底清空数据(如定期数据清理)。 - 处理大型表时,以快速释放空间(避免碎片问题)$^{(1)}$[^1]。 - **使用`DROP`的场景**: - 表已废弃(如临时表),需永久删除结构和所有依赖项。 - 数据库重构时移除不再使用的对象$^{(2)(3)}$[^2][^3]。 **关键提示**:在实际操作中,`TRUNCATE`和`DROP`都应谨慎使用,尤其在生产环境下。建议先通过SQL备份或数据泵导出保护数据。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值