如何删除压缩表中的列?

时间:2018-05-30 08:37:41

标签: sql oracle oracle11g

压缩表后,无法再删除列:

CREATE TABLE foo (p NUMBER, i NUMBER, j NUMBER) COMPRESS BASIC;

ALTER TABLE foo DROP COLUMN j;
ORA-39726: unsupported add/drop column operation on compressed tables

可以使用高级压缩:

CREATE TABLE foo (p NUMBER, i NUMBER, j NUMBER) COMPRESS FOR OLTP;

ALTER TABLE foo DROP COLUMN j;
Table FOO altered.

但是,该列并未真正删除,只是隐藏:

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

COLUMN_NAME                 DATA_TYPE  HIDDEN_COLUMN
P                           NUMBER     NO
I                           NUMBER     NO
SYS_C00002_18030204:09:26$  NUMBER     YES

这会在交换分区时导致错误:

CREATE TABLE par (p NUMBER, i NUMBER) 
 PARTITION BY LIST(p)(
 PARTITION p1 VALUES(1), 
 PARTITION p2 VALUES(2)
);

ALTER TABLE par EXCHANGE PARTITION p1 WITH TABLE foo;
ORA-14097: column type or size mismatch in ALTER TABLE EXCHANGE PARTITION

如何删除隐藏列?我试过了

ALTER TABLE foo DROP UNUSED COLUMNS;

但它没有帮助:

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

COLUMN_NAME                 DATA_TYPE  HIDDEN_COLUMN
P                           NUMBER     NO
I                           NUMBER     NO
SYS_C00002_18030204:09:26$  NUMBER     YES

3 个答案:

答案 0 :(得分:2)

Oracle支持文档1987500.1 "如何删除压缩表中的列" 有解决方案:首先需要解压缩表,删除列,然后将其压缩再次:

ALTER TABLE foo MOVE NOCOMPRESS;
ALTER TABLE foo DROP UNUSED COLUMNS;
ALTER TABLE foo MOVE COMPRESS FOR OLTP;

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

COLUMN_NAME                 DATA_TYPE  HIDDEN_COLUMN
P                           NUMBER     NO
I                           NUMBER     NO

ALTER TABLE par EXCHANGE PARTITION p1 WITH TABLE foo;
Table PAR altered.

N.B。如果表为空,则压缩/重新压缩很快。

答案 1 :(得分:0)

update foo set j = null;
commit;
alter table foo set unused column j;

Read more

答案 2 :(得分:0)

我在压缩表时遇到了类似的问题。后来,当尝试删除该压缩表中的一列时,它给我错误ORA-39726:在压缩表上不支持的添加/删除列操作。

最适合我的解决方案是-我在表上运行了COMPRESS FOR ALL OPERATIONS命令,然后运行了drop column命令,它对我有用。

例如:ALTER TABLE 压缩所有操作;

ALTER TABLE DROP COLUMN ;