OID 与隐含列

熟悉PostgreSQL的都知道,PG12 开始,不再支持OID伪列。KingbaseES 为了保证与旧版本兼容,特增加了OID 隐含列的支持。

  • R3版本:OID 是整个数据库共用的“序列”对象;是4字节的无符号整型,其最大值40亿;会循环,不能使用OID来保证数据唯一,需要唯一性索引保证数据唯一;
  • R6版本:OID 是特定表对象私有的序列,在创建表时,会顺带创建序列;序列的最大值是 2147483647 , 不会循环;要想保证OID唯一,同样需要创建唯一索引;

参数 default_with_oids 默认为 off ,表示默认建表不带 OID,但可以在建表时 加 with OIDS选项。

可以对OID 创建索引:create index ind_tab3 on tab3(oid);

隐含列

隐含列为表中各个列的一个特殊的属性,可以在建表过程中指定,也可以通过表的ALTER 语句变更某一列的隐含属性,具体语法可以参考创建表语法和ALTER TABLE 语法。

CREATE TABLE IMPLICT_T1(
  OID INT INVISIBLE,
  B INT,
);
ALTER TABLE IMPLICT_T1 MODIFY OID VISIBLE;
ALTER TABLE IMPLICT_T1 MODIFY NAME INVISIBLE;

如果一个列被标记为隐含列之后,所有非指定该列的DML 行为,例如SELECT *、COPY、bulkload 等等,都会忽略该列。而所有指定该列的语句,都会命中该列。

-- INSERT 语句需要指定隐含列
INSERT INTO IMPLICT_T1(OID, B, NAME) VALUES(1, 2, 'IMPLICT');
-- 查询语句不指定隐含列,将忽略该列 SELECT * FROM IMPLICT_T1; postgres=# select * from implict_t1; b | name ---+--------- 2 | implict (1 row)

参考Oracle 的特性,所有列都赋予了一个COLUMN ID 的属性,COLUMN ID 从1 开始,如果某一列被设置为隐含列,那么它的COLUMN ID 则设置为NULL。

 

posted @ 2021-12-01 09:19  KINGBASE研究院  阅读(253)  评论(0编辑  收藏  举报