目录
一、隐形列的概念
在数据库升级过程中,如果我们想对表增加列,但又不能影响当前应用,那么我们利用Oracle隐形列的特性来隐藏新增的列。待应用升级后再将列设置为可见。列的状态可以在隐形、显形之间随意切换。
列在隐形的状态下,不会被常规的查询方法显示,包括:
- select * from 不会查出隐形列
- describe/desc 显示的表结构不回包含隐形列
- PL/SQL中%rowtype属性定义不会包含隐形列
- Oracle Call Interface(OCI)描述中不会包含隐形列
如果要查询隐形列,唯一的方法就是在select子句中显式的指定列名。同理,在insert语句中,也必须显式指定列名才能向隐形列插入数据。
隐形列的使用也限制,在下列3类表中无法定义隐形列:
- 外部表(External Tables)
- 聚簇表(Cluster Tables)
- 临时表(Temporary Tables)
二、隐形列的定义
隐形列可以在建表的时候使用invisible关键字来定义,下列示例将第二列b定义为隐形列,用desc语句查看表结构是看不到b列的:
create table inv_table (
a int,
b int invisible, -- 建表时定义隐形列
c int);
desc inv_table;
在建表后也可以利用 alter table 的modify子句将可见列转换成隐形列,示例将c列也转换为隐形列:
alter table inv_table modify c invisible; -- 将已有列转换为隐形列
desc inv_tables;
隐形列的使用只能够通过显式指定列名来引用,由于b,c列都是隐形列,select * from只能查出列a:
insert into inv_table(a,b,c) values(1,2,3); -- 显示指定列名
select * from inv_table;
select a, b, c from inv_table; -- 显示指定列名
通过alter table 的modify … visible子句可以将隐形列转换为普通列:
select *from inv_table;
alter table inv_table modify c visible; -- 将隐形列转变为正常列
select * from inv_table;
三、隐形列对列排序的影响
表中的列是有排序的,例如我们在使用select *查询时,列的显示顺序就是建表时列的定义顺序。但是隐形列是不参与表中列的排序的,如果某列由隐形变为显形,那么总是会附加到表的最后,因此隐形列会导致表中列排序的变化,这点需要注意。
示例中,我们将列a先变为隐形,然后再显形,通过同样的select *语句,可以看到列的排序改变了。
select * from inv_table;
alter table inv_table modify a invisible;
alter table inv_table modify a visible;
select * from inv_table;