PostgreSQL隐藏列(兼容oracle)
oracle 12cR1新增了隐藏列的功能,在之前的版本中,为了隐藏重要的数据字段以避免在通用查询中显示,我们往往会创建一个视图来隐藏所需信息或应用某些安全条件,现在我们可以通过隐藏列来实现这一功能。
同时,当我们需要删除一张表的某一列时,如果系统正在允许时直接删除必然会锁表,且数据量大时会锁住很久。这时我们也可以通过隐藏列先将该列隐藏,因为该操作是直接修改数据字典,并没有正在删除数据,等闲时再drop掉该列即可。
另外oracle的隐藏列有几个注意点:
1、可以将主键、外键都隐藏,但是隐藏之后不能恢复;
2、临时表、外部表、集群表均不支持隐藏列
例子:
–建表插入数据
SQL> create table test(id int,id1 int,id2 int,id3 int); Table created.SQL> insert into test values(1,2,3,4); 1 row created.SQL> commit;Commit complete.
–查看
SQL> desc test;Name Null? Type----------------------------------------- -------- ----------------------------ID NUMBER(38)ID1 NUMBER(38)ID2 NUMBER(38)ID3 NUMBER(38)SQL> select * from test;ID ID1 ID2 ID3
---------- ---------- ---------- ----------1 2 3 4
–将id2列设置为隐藏列
SQL> alter table test modify id2 invisible; Table altered.
–再次查看和插入数据
SQL> select * from test;ID ID1 ID3
---------- ---------- ----------1 2 4
SQL> desc test;Name Null? Type----------------------------------------- -------- ----------------------------ID NUMBER(38)ID1 NUMBER(38)ID3 NUMBER(38)SQL> insert into test values(11,12,13,14);
insert into test values(11,12,13,14)*
ERROR at line 1:
ORA-00913: too many values
–指定列查看和插入数据
SQL> insert into test(id,id1,id2,id3) values(11,12,13,14); 1 row created.SQL> select id,id1,id2,id3 from test; ID ID1 ID2 ID3
---------- ---------- ---------- ----------1 2 3 411 12 13 14
那么在pg中隐藏列该如何实现呢?
目前的pg版本中还不支持隐藏列这一功能,将来可能支持,但是我们可以实现类似的功能。
1、使用oid实现隐藏列的功能:
oid为隐藏列。但是最大只能存储40亿条。也就是单表的记录数不能超过40亿,否则可能重复。
bill=# create table st5 (id int, info text, crt_time timestamp) with (oids);
CREATE TABLE
bill=# alter table st5 add constraint pk_st5 primary key(oid);
ALTER TABLE
bill=# insert into st5 values (1,'a',now());
INSERT 81965 1
bill=# select * from st5; id | info | crt_time
----+------+---------------------------1 | a | 2020-01-13 20:55:38.38011
(1 row)bill=# select oid,* from st5; oid | id | info | crt_time
-------+----+------+---------------------------81965 | 1 | a | 2020-01-13 20:55:38.38011
(1 row)
2、使用继承表实现类似功能
实现思路:
pg inherits,继承表增加隐藏字段,真实的数据存储在继承表,主表是用户使用的表(没有隐藏字段)。使用触发器,将数据写入到继承表。
需要注意的是,复制时,解析出来的是继承表的变化,而不是主表。
bill=# create table orig (id int, info text, crt_time timestamp);
CREATE TABLE
bill=# create table hid_orig (id int, info text, crt_time timestamp, hid serial8 primary key) inherits(orig);
NOTICE: merging column "id" with inherited definition
NOTICE: merging column "info" with inherited definition
NOTICE: merging column "crt_time" with inherited definition
CREATE TABLE
bill=# create or replace function tg() returns trigger as $$
bill$# declare
bill$# begin
bill$# insert into hid_orig (id,info,crt_Time) values (new.*);
bill$# return null;
bill$# end;
bill$# $$ language plpgsql strict;
CREATE FUNCTION
bill=# CREATE FUNCTION
bill=# create trigger tg before insert on orig for each row execute procedure tg();
CREATE TRIGGER
bill=# insert into orig values (1,'test',now());
INSERT 0 0
bill=# select * from orig; id | info | crt_time
----+------+----------------------------1 | test | 2020-01-13 20:57:12.855603
(1 row)bill=# select * from hid_orig; id | info | crt_time | hid
----+------+----------------------------+-----1 | test | 2020-01-13 20:57:12.855603 | 1
(1 row)bill=# update orig set info='new' where id=1;
UPDATE 1
bill=# select * from orig; id | info | crt_time
----+------+----------------------------1 | new | 2020-01-13 20:57:12.855603
(1 row)bill=# select * from hid_orig; id | info | crt_time | hid
----+------+----------------------------+-----1 | new | 2020-01-13 20:57:12.855603 | 1
(1 row)
PostgreSQL隐藏列(兼容oracle)相关推荐
- PostgreSQL hint用法(兼容oracle)
Hint是Oracle数据库中很有特色的一个功能,pg和oracle的优化器一样也是CBO(基于成本的).但是在pg中是没有hint的,但是我们可以去通过设置成本因子,设置优化器开关等方式来" ...
- postgres oracle 兼容,PostgreSQL嵌套表(兼容oracle)
oracle中的嵌套表是某些行的集合,它在主表中表示为其中的一列.对主表中的每一条记录,嵌套表可以包含多个行. 通俗地说,嵌套表就是表中的表,把一个表中的字段定义为一个表,这个字段表的数据存储在外部的 ...
- oracle listagg支持,PostgreSQL行列转换(兼容oracle listagg)
oracle11g开始支持的listagg函数替代了wmconcat来实现行列转换的功能. listagg函数的用法: oracle行列转换例子: -建表https://www.cndba.cn/fo ...
- postgresql 数据库表隐藏列 oid、tableoid、ctid、xmin、xmax、cmin、cmax
os: centos 7.4 db: postgresql 10.11 oid.tableoid.ctid.xmin.xmax.cmin.cmax 这些都是 postgresql 数据库表的隐藏列. ...
- PostgreSQL实现USERENV函数(兼容oracle)
oracle中使用USERENV 函数来获取当前会话变量的函数,支持的参数有: CLINET_INFO 返回最高可达64个字节存储的用户会话信息,可由应用程序使用DBMS_APPLICATION_IN ...
- oracle 临时表存在哪里_openGauss魔改PG?它能兼容Oracle的数据库表吗?
作者介绍 洪烨,openGauss Contributor,多年银行业系统架构设计及DBA实战经验,<DB2数据库内部解析与性能调优>作者. openGauss的前世今生 上一篇看到很多朋 ...
- oracle中orand使用,Postgres兼容Oracle研究——orafce调研
一.背景 PostgreSQL是和Oracle最接近的企业数据库,包括数据类型,功能,架构和语法等几个方面.甚至大多数的日常应用的性能也不会输给Oracle. 但是Oracle有些函数或者包,默认Po ...
- 达梦数据库兼容Oracle之SQL语法(一)
对于刚从Oracle数据库转到达梦数据库,SQL语法的使用基本一致,有一些差别,下面总结的一些常用SQL语法差别. 文章目录 1.导入数据 2.返回查询数据的返回行 3 外连接用法 4.多列IN用法 ...
- oracle 11g dul,【学习笔记】Oracle DUL 11 兼容Oracle 12C数据库的DUL工具最新版本
天萃荷净 oracle dul 11 正式发布,迫不及待的下载来测试,现在版本号为dul 11.2.0.0.1,目前只发布了for linux,其他版本估计要等等.期待该版本有引进新功能 1.orac ...
最新文章
- 生鲜电商APP开发,有哪五大商机?
- sata接口_固态硬盘应该怎么选?是SATA接口还是M.2接口好
- java内存对象模型
- Spark SQL 1.x之SQL Context使用
- 希赛软件设计师视频教程-3.1 进程(第三部分) 标清
- windows7无人值守应答文件.rar_数智化赋能人力共享运营,人力管理走向“无人值守”...
- 申通快递机器人上岗_【峰暴】618, 数万台机器人上岗为您服务!
- 力扣-547 省份数量
- iOS开发之模拟器(simulator)的复制粘贴
- php防止网站被镜像,网站防止被其他站iframe框架引用镜像的方法
- 如何理解t检验、t分布、t值?
- vb可以开发用c语言,c语言和vb语言的区别是什么?_后端开发
- 微信可以用邮箱吗?邮箱无法分享到微信怎么办?微信邮箱从哪找呢
- Java筑基10-封装继承多态(重点)
- 前度字符串转数组_leetcode每日一题
- 计算机编程课是学什么的,编程是什么课程
- 17计算机七班班级活动,2017班级主题活动方案设计
- FFmpeg视频录制(WIN)
- 今天拿到软件设计师证书
- 视频编码中CBR和VBR的区别