Oracle 隐形列(Oracle Invisible Columns)

目录

一、隐形列的概念

二、隐形列的定义

三、隐形列对列排序的影响


一、隐形列的概念

在数据库升级过程中,如果我们想对表增加列,但又不能影响当前应用,那么我们利用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;

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值