8i以前,如果需要删除表中的列,需要删除表然后重新建。现在,但我们需要删除一个列时,可以有以下两种方法:

  • Logical Delete
  • Physical Delete

Logical Delete(逻辑删除)

我们需要删除表的一个列,通常采用物理删除(ALTER TABLE table_name DROP COLUMN column_name)。但如果是一个大表,这将是一个及其消耗时间和资源的操作。假若在系统繁忙时对大表做物理删除,甚至可能会收到 ORA-01562 - failed to extend rollback segment number string。这是因为在这个删除列的过程中,可能会消耗光整个undo segment.

此时,我们可以采用逻辑删除列:

ALTER TABLE table_name SET UNUSED (column_name);
ALTER TABLE table_name SET UNUSED (column_name1, column_name2);

逻辑删除后,被删除的列就不可见了。之后便可以用以下命令进行物理删除:

ALTER TABLE table_name DROP UNUSED COLUMNS;

对于大表,为了减少undo logs,我们可以使用CHECKPOINT选项在处理了特定行后来强制checkpoint操作。

ALTER TABLE table_name DROP UNUSED COLUMNS CHECKPOINT 5000;

我们可以在DBA_UNUSED_COL_TABS查看每个表中被设置为unused的列的数量。

Physical Delete(物理删除)

ALTER TABLE table_name DROP COLUMN column_name;
ALTER TABLE table_name DROP (column_name1, column_name2);

使用DROP COLUMN物理删除表中列的同时,也会物理删除表中unused的列。

测试代码:

SQL> create table test (t1 varchar2(10), t2 number, t3 number);

Table created

SQL> insert into test values ('Tough1',1,1);

1 row inserted

SQL> insert into test values ('Tough2',2,2);

1 row inserted

SQL> select * from test;

T1                 T2         T3
---------- ---------- ----------
Tough1              1          1
Tough2              2          2

--逻辑删除test表的t3列
SQL> alter table test set unused (t3);

Table altered

--此时t3列已经不可见
SQL> select * from test;

T1                 T2
---------- ----------
Tough1              1
Tough2              2

--我们可以在user_unused_col_tabs表中查看到test表中设置为unused列的数量
SQL> select * from user_unused_col_tabs;

TABLE_NAME                          COUNT
------------------------------ ----------
T2                                      2
TEST                                    1

--物理删除test表的t2列
SQL> alter table test drop column t2;

Table altered

--物理删除test表t2列时,把之前逻辑删除的t3列也物理删除了
SQL> select * from user_unused_col_tabs;

TABLE_NAME                          COUNT
------------------------------ ----------
T2                                      2

SQL> select * from test;

T1
----------
Tough1
Tough2


drop column与set unused的更多相关文章

  1. [每日一题] OCP1z0-047 :2013-07-15 drop column

    如下实验: gyj@OCM> Create table emp( 2    Empno     number(4)    not null, 3    First_name  varchar2( ...

  2. SQLite无法使用drop column删除表字段解决办法

    由于项目需求变更,我需要在sqlite数据库的表中删除一个字段,通用的sql操作语句如下: alter table record drop column name; 结果数据库提示如下错误: 搜索得知 ...

  3. 【数据库】——SQLite使用drop column删除表字段

    由于项目需求变更,我需要在sqlite的表中删除一个字段,通用的sql操作语句如下: alter table task drop column custom_fields; 结果数据库提示如下错误: ...

  4. SQL SERVER删除列,报错."由于一个或多个对象访问此列,ALTER TABLE DROP COLUMN ... 失败"

    队友给我修改数据的语句.总是执行失败.很纳闷. 如下图: 仔细看了下这个列,并没有什么特殊.如下图: 但其确实有个约束: 'DF__HIS_DRUG___ALL_I__04E4BC85' . 为什么有 ...

  5. 如何drop大表的中不用的字段 set unused column

    转自 http://foxmile.blog.163.com/blog/static/81169805201143191957184/ 我 们要删除表中不用的字段,如果直接drop column,对于 ...

  6. drop有default constraint的column

    有时候我们在drop column的时候,会遇到一些default constraints而不能drop,如果我们已经知道constraint name,则可以用下面的语句先把constraint r ...

  7. set unused的用法(ORACLE删除字段)

    set unused的用法(ORACLE删除字段) 一.问题 现场有一张大数据量的分区表,数据量在10G以上.因某种原因需要删除其中的某些字段.如果直接用alter table1 drop (colu ...

  8. ORACLE删除字段(set unused的用法)

    一.问题 现场有一张大数据量的分区表,数据量在10G以上.因某种原因需要删除其中的某些字段.如果直接用 alter table1 drop (column1,column2); 或者alter tab ...

  9. Oracle SET UNUSED的用法

    SET UNUSED的用法 原理:清楚掉字典信息(撤消存储空间),不可恢复.    可以使用 SET UNUSED选项标记一列或者多列不可用.    使用DROP SET UNUSED选项删除被被标记 ...

随机推荐

  1. EXTJS 常用控件的使用

    重要按钮配置项 handler: renderTo: 取得控件及其值 var memo = form.findById('memo');//取得输入控件 alert(memo.getValue()); ...

  2. [转]Oracle hang分析

    hanganalyze是ORACLE的一款性能诊断工具,这个款工具是从oracle 8.0.6开始可用,在oracle数据库出现严重的性能问题的时候它可以帮助你定位问题所在. 1.首先说说hangan ...

  3. 关于FastStone Capture输入中文出现乱码.

    关于FastStone Capture 中输入中文出现乱码. 根据我的使用,公司用的生产机是英文操作系统,这个时候用FSCapture输入中文就是乱码.英文是正常的. 自己的机器是中文的.输入中文和英 ...

  4. Centos系统使用代理上网时 yum的代理设置

    yum的存在使centos上软件的安装.配置.升级.卸载变得十分的方便,但是当安装centos的机器是通过代理服务器访问外网的话,yum的 使用就变得无从下手了,以下介绍以下怎样为yum配置代理地址及 ...

  5. [Yii2]Access to debugger is denied due to IP address restriction. The requesting IP address is

    在更新到正式平台,看到runtime/app.log 有 Access to debugger is denied due to IP address restriction. The request ...

  6. 第一回 认识Bootstrap

    Bootstrap 是Twitter推出的一个用于前端开发的开源工具包. Bootstrap是基于HTML5和CSS3开发的,它在jQuery的基础上进行了更为个性化和人性化的完善,形成一套自己独有的 ...

  7. AngularJS Tabular Data with Edit/Update/Delete

    效果 首先,我们先建立一些数据,当然你可以从你任何地方读出你的数据 var app = angular.module('plunker', ['ui.bootstrap']); app.control ...

  8. 最新app源码下载:200款优秀Android项目源码

    200款优秀Android项目源码!菜鸟必备!Android开发又将带来新一轮热潮,很多开发者都投入到这个浪潮中去了,创造了许许多多相当优秀的应用.其中也有许许多多的开发者提供了应用开源项目,贡献出他 ...

  9. Android之标签选项卡

    TabWidget可以通过不同的标签进行切换并且显示不同的内容,相当于Button按钮实现不同的功能. TabHost的布局: (1):我们先在Layouts拖一个Vertical(纵向视图)的Lin ...

  10. C# 私人笔记

    .ADO.NET 连接数据库的模版 string constr = "data source=127.0.0.1\\mysql2008;database=dbtest;integrated ...