Oracle 删除列 drop columns

本文介绍了在Oracle数据库中逻辑上及物理上删除表列的方法。逻辑删除通过设置列为unused实现,这种方式不会立即回收空间但可通过特定命令完成。物理删除则直接移除列,并且无法回滚。文章还提供了具体的SQL命令示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Oracle 删除列 drop columns

逻辑上删除

当在一张很大的表中物理上删除列的时候,需要消耗很多的资源和时间,这时候我们可以简单的把要删除的列设置为unused,这就是从逻辑上面删除了表中的列(对数据库中元数据进行的修改)。 
SQL> create table emp as select * from employees; 
Table created.–创建一张测试用的表,结构和employees一致。 
SQL> alter table emp set unused (salary); 
Table altered.–将salary 列设置为unused. 
这时候使用desc 查看表的结构就不会存在salary 这一列了,该列对用户是不可见不可用的。 
SQL> select max(salary) from emp; 
select max(salary) from emp 

ERROR at line 1: 
ORA-00904: “SALARY”: invalid identifier 
可以通过*_unused_col_tabs 查看到表中删除的列的数量。 
SQL> select * from dba_unused_col_tabs 
2 where table_name = ‘EMP’; 
OWNER TABLE_NAME COUNT


HR EMP 1 
如果需要回收设置为unused 的列所占用的空间,可以使用以下的语句。 
checkpoint 的意义在于当在一个很大的表中删除一个列的时候需要长时间占用很多的undo 空间,这可能会影响到其他操作对undo 空间的获取,所以指定处理完一定数量的列以后,执行一次checkpoint 释放undo空间。 
SQL> alter table emp drop unused columns checkpoint 250; 
Table altered. 
上述语句会把某张表中所有设置为unused 的列都删除掉。 
同时需要注意的是设置为unused 的列是不可以恢复的。不存在类似rollback 的方式。

物理上删除

可以使用以下的方式物理上面删除一个列: 
SQL> alter table emp drop column commission_pct; 
Table altered.–一次只删除一个列。 
SQL> alter table emp drop (first_name,last_name); 
Table altered.–一次删除多个列。 
物理上删除的列也不存在类似rollback 的恢复方式。 
注:不能删除一个表中所有的列。 
当物理上删除一个表中的列的时候,该表中所有设置为unused 的列也会被删除。

感谢:https://blog.youkuaiyun.com/tajun77/article/details/50461755

<think>嗯,用户问的是如何在Oracle数据库中使用ALTER TABLE删除指定的一。首先,我得回忆一下ALTER TABLE的用法,特别是删除的部分。记得ALTER TABLE可以用来修改表结构,比如添加、删除或者修改的数据类型。 根据引用[4]里提到,“删除指定的一”用的是ALTER TABLE ... DROP COLUMN ...的语法。比如例子中的alter table t1 drop column hiredate; 这样就能删除hiredate了。所以基本语法应该是ALTER TABLE 表名 DROP COLUMN 名;。 不过,可能还需要考虑一些其他情况。比如,如果有约束或者索引,删除时会不会有问题?这时候可能需要检查是否有依赖关系,或者使用CASCADE CONSTRAINTS来级联删除约束。引用[4]的例子中没有提到这个,但实际应用中可能存在这种情况,所以应该提醒用户注意这一点。 另外,引用[3]提到truncate tabledrop table的区别,虽然不直接相关,但说明删除操作有不同的类型。删除属于结构修改,和删除数据或表不同。用户需要明确是要删除结构中的,而不是数据。 用户可能需要知道删除后是否会影响现有数据,以及如何验证删除是否成功。建议他们删除后使用DESC 表名或者查询数据字典视图来确认已经不存在。 还有,如果删除的是大表的一,可能会涉及性能问题,比如表重构需要时间,或者占用回滚段空间。这时候可能需要使用ALTER TABLE ... DROP COLUMN ... CHECKPOINT,或者分步操作,比如先标记为未使用再删除,以减少对系统的影响。不过引用中没有提到这部分,可能需要进一步确认Oracle版本是否支持这些选项。 总之,核心步骤是使用ALTER TABLE加上DROP COLUMN子句,同时注意约束和性能问题。需要确保用户理解语法和可能的影响,并提供验证方法。</think>在Oracle数据库中使用`ALTER TABLE`语句删除指定的步骤如下: ### 一、基本语法 ```sql ALTER TABLE 表名 DROP COLUMN 名; ``` ### 二、操作示例 假设需要从表`t1`中删除名为`hiredate`的: ```sql ALTER TABLE t1 DROP COLUMN hiredate; --直接删除[^4] ``` ### 三、注意事项 1. **依赖关系检查** - 若关联了约束、索引或视图,需先处理依赖对象 - 可使用`CASCADE CONSTRAINTS`级联删除约束: ```sql ALTER TABLE t1 DROP COLUMN hiredate CASCADE CONSTRAINTS; --强制删除及相关约束 ``` 2. **数据存储变化** - 删除会导致表段重组,可通过`MOVE`操作优化存储: ```sql ALTER TABLE t1 MOVE TABLESPACE users; --重组表存储[^4] ``` 3. **验证删除结果** ```sql DESC t1; --查看表结构 SELECT * FROM user_tab_columns WHERE table_name = 'T1'; --查询数据字典 ``` ### 四、扩展用法 ```sql ALTER TABLE t1 DROP (名1, 名2); --同时删除 ALTER TABLE t1 SET UNUSED COLUMN hiredate; --标记未使用后再删除 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值