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. VMware系统运维(二)安装Microsoft .NET 3.5

    1.安装vmware vSphere 5.5 之前先安装Microsoft .NET 3.5. 2.安装Microsoft .NET3.5,添加角色和功能. 3.勾选.NET Framework 3. ...

  2. 关于php一些数组函数

    array_column($array,"key") 将二维数组中的键名为key的数据生成一个新数组 array_unique($array) 去除重复值

  3. 关于win7系统中所有exe文件都被以word方式打开的解决方法

    手残一刻,电脑桌面所有的软件快捷方式都变成了word的打开方式,鼠标右键选中某exe文件也没打开方式那个选项, 第一次尝试: 在控制面板——默认程序中修改默认打开方式,但是没有找到解决方法

  4. template和templateUrl区别与联系

    templateUrl其实根template功能是一样的,只不过templateUrl加载一个html文件,template后面根的是html的标签. .state('menu.about', { u ...

  5. 关于JDK中的总结和基本知识总结

    人机交互的图形化界面(GUI) 命令行方式(CLI  command line interface) JDK有不同的版本(linux,mac os, windows) Java 的跨平台性. 软件放到 ...

  6. poj 3159 差分约束

    思路:班长的糖果要比snoopy的多.并且要用手写堆栈,且堆栈的大小要开到20000000. #include<iostream> #include<cstdio> #incl ...

  7. AutoHotKey 脚本集中营(一)

    前言:实战是最好的学习.本集中营共分 x+mc2 期(x 为已发行的期数,m 为我的空闲时间,c 为我的更新动力),旨在通过对脚本代码的阅读而提高 AHK 语言的熟练程度.脚本的难度与期数成正比,有兴 ...

  8. asp.net mvc 的几种分页Pager

    第一种 /// <summary> /// 分页Pager显示 /// </summary> /// <param name="html">&l ...

  9. javascript事件学习笔记

    事件冒泡 并不是所有的事件都支持事件冒泡,比如submit ,focus,blur不支持事件冒泡,mouseover,mouseout虽然支持冒泡,但是一般不用,因为需要经常计算元素的位置,消耗比较大 ...

  10. Emmet 语法大全(缩写语法/sublime 插件)

    Emmet 使用类似于 CSS 选择器的语法描述元素在生成的文档树中的位置及其属性. 元素 可以使用元素名(如 div 或者 p)来生成 HTML 标签.Emmet 没有预定义的有效元素名的集合,可以 ...