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. 如何使用数据卷在宿主机和docker容器之间共享文件

    共享宿主机的目录给容器 docker run -i -t -v ~/download:/home/hello python3-env /bin/bash -v  表示创建一个数据卷并挂载到容器里 ~/ ...

  2. 为MYPoint类写一个分类

    #import <Foundation/Foundation.h> //xieyi @protocol showOn @required -(void)printOn; @end // l ...

  3. [转]IIS7.5 添加expires头 提高性能

    本文转自:http://niutuku.com/tech/www/271454.shtml 对于页面中不经常变化的静态内容通过指定expires头,来进行浏览器端的缓存,减少每次访问时的请求. 原理: ...

  4. CentOS 6.6下Redis安装

    安装redis的过程非常的简单,具体参考教程官网:http://redis.io/download 1.下载并安装 下载的redis-3.2.5.tar.gz安装包默认在/usr/local/src/ ...

  5. Windows 8.1 归档 —— Step 1 选择与安装

    下面是 Windows 8.1 各版本区别: Windows 8.1 标准版(一般就称之为Windows 8.1): 包括全新的 Windows 商店.Windows 资源管理器.任务管理器等等,还将 ...

  6. 转: 基于nginx的hls直播系统

    转自:http://blog.csdn.net/cjsafty/article/details/9108587 看点: 1. 详细解解答了 nginx rtmp配置过程. 前写了一篇基于nginx的h ...

  7. Spring(3.2.3) - Beans(12): 属性占位符

    使用属性占位符可以将 Spring 配置文件中的部分元数据放在属性文件中设置,这样可以将相似的配置(如 JDBC 的参数配置)放在特定的属性文件中,如果只需要修改这部分配置,则无需修改 Spring ...

  8. MyBatis(3.2.3) - Paginated ResultSets using RowBounds

    Sometimes, we may need to work with huge volumes of data, such as with tables with millions of recor ...

  9. Ehcache(2.9.x) - Configuration Guide, Configuring Cache

    About Ehcache Configuration Ehcache supports declarative configuration via an XML configuration file ...

  10. HTML特殊符号对照表(转)

    table { border-collapse: collapse; } #htmlchar-container-list { width: 100%; border-top: 2px solid # ...