如何删除Oracle 12c中的隐藏列?

时间:2018-05-30 08:01:22

标签: oracle oracle12c ddl

在Oracle 12中添加DEFAULT xxx NULL新列时,会发生一些数据字典魔法,并创建一个隐藏列:

CREATE TABLE bar (i NUMBER);

ALTER TABLE bar ADD (d NUMBER DEFAULT 1 NULL);

SELECT column_name, data_type, hidden_column 
  FROM user_tab_cols WHERE table_name = 'BAR';

COLUMN_NAME   DATA_TYPE  HIDDEN_COLUMN
I             NUMBER     NO
SYS_NC00002$  RAW        YES
D             NUMBER     NO

根据DDL Optimization in Oracle Database 12c,隐藏专栏正在帮助实现此新功能。

如何删除此隐藏列?

我试过了:

CREATE TABLE newbar AS SELECT * FROM bar;

有效,但所有依赖对象(注释,触发器,授权索引等)都必须重新创建,这很糟糕。

删除未使用的列无济于事:

ALTER TABLE bar DROP UNUSED COLUMNS;
SELECT column_name, data_type, hidden_column 
  FROM user_tab_cols WHERE table_name = 'BAR';

COLUMN_NAME   DATA_TYPE  HIDDEN_COLUMN
I             NUMBER     NO
SYS_NC00002$  RAW        YES
D             NUMBER     NO

移动表也无济于事:

ALTER TABLE bar MOVE;

根据Doc Id 2277937.1,可以使用

预先禁用该功能
ALTER SESSION SET "_add_col_optim_enabled" = FALSE;

但我真的在寻找像

这样的陈述
ALTER TABLE bar MOVE ... 

停止魔法并删除隐藏的列。

1 个答案:

答案 0 :(得分:1)

只有alter table BAR drop column D;

(我在DB ver. 12.1.0.2发出)