#伪列

伪列的行为类似于普通列,但其数据并不存储在表中。用户可以SELECT伪列,但不能对伪列进行INSERT、UPDATE、DELETE操作。

YashanDB存在如下五种伪列:

  • ROWSCN
  • ROWID
  • ROWNUM
  • SEQUENCE
  • USER

# ROWSCN伪列

ROWSCN伪列表示行最后一次被修改的SCN。YashanDB的ROWSCN为页面级别,一般情况下返回的ROWSCN是行所在页面最后一次修改并提交的BLOCK SCN,如使用特殊查询条件可能会返回该行最后一次修改并提交的SCN,例如使用ROWID为查询条件时。

若事务修改了表中某行数据并提交了修改,后续查询该行的ROWSCN时,返回值仅会大于或等于修改前的ROWSCN。

该伪列仅适用于HEAP表。

示例

SELECT ROWSCN FROM area;

# ROWID伪列

ROWID伪列表示行所在的地址。ROWID伪列的类型为ROWID类型,更多说明请参考ROWID UROWID章节描述。

该伪列仅适用于HEAP表。

示例

SELECT ROWID FROM area;

# ROWNUM伪列

ROWNUM伪列是系统顺序分配的查询返回的行编号,返回的第一行分配的是1,第二行是2,依此类推。该伪列可用于限制查询返回的总行数。

分布式部署中不支持使用该伪列。

示例

SELECT * FROM area WHERE ROWNUM < 2;

AREA_NO AREA_NAME                                                     DHQ                   
------- ------------------------------------------------------------- --------------------- 
01      华东                                                        Shanghai             

若将ROWNUM与ORDER BY一起使用,会先从表中取出符合ROWNUM条件的行然后再进行排序,其结果取决于执行计划,执行计划不同可能会导致取得的行不同。

示例

--创建表STUDENTS
CREATE TABLE STUDENTS(num INT,score INT);
INSERT INTO STUDENTS VALUES(1,99);
INSERT INTO STUDENTS VALUES(1,76);
INSERT INTO STUDENTS VALUES(1,84);
INSERT INTO STUDENTS VALUES(1,63);
INSERT INTO STUDENTS VALUES(1,88);
COMMIT;
-- 查询成绩前3的学生成绩,先取出3行再进行排序,结果不一定正确
SELECT score FROM STUDENTS WHERE ROWNUM < 4 ORDER BY score DESC;
-- 查询成绩前3的学生成绩,可以使用order by + limit
SELECT score FROM STUDENTS ORDER BY score DESC LIMIT 3;
-- 查询成绩前3的学生成绩,可以使用子查询 + ROWNUM
SELECT score FROM (SELECT score FROM STUDENTS ORDER BY score DESC) WHERE ROWNUM < 4;

YashanDB支持使用ROWNUM给表上每一行附上唯一的值。

示例

UPDATE STUDENTS SET num = ROWNUM;

YashanDB不支持使用ROWNUM大于某正数作为查询条件,会导致查询结果总为空。

示例

SELECT * FROM STUDENTS WHERE ROWNUM > 1;

更多使用场景和限制请参考condition章节中有关ROWNUM部分的描述。

# SEQUENCE伪列

SEQUENCE伪列是创建序列对象时生成的唯一序列号,可分为如下两种类型:

  • CURRVAL: 返回当前序列号值,即当前session上一次获取到的NEXTVAL值。
  • NEXTVAL: 增加序列号的值并返回序列的NEXTVAL。

分布式部署中不支持使用该伪列。

示例

获取序列号:

sequence.CURRVAL
sequence.NEXTVAL

获取指定schema的序列号:

schema.sequence.CURRVAL
schema.sequence.NEXTVAL

可以在以下场景使用CURRVAL伪列与NEXTVAL伪列:

  • SELECT语句中select列中不包含子查询的场景
  • INSERT语句中的select从句
  • INSERT语句中的values从句
  • UPDATE语句中的set从句

禁止使用的场景:

  • DELETE, SELECT, UPDATE语句中的子查询语句
  • 带有DISTINCT算子的SELECT语句
  • 带有GROUP BY或者ORDER BY子句的SELECT语句
  • 多个SELECT语句通过UNION集合
  • SELECT语句中的where子句

当你创建序列后,使用CURRVAL前必须先查询NEXTVAL来初始化CURRVAL值。

示例

用以下语法获取序列号:

CREATE SEQUENCE seq_yashan1;
 
SELECT seq_yashan1.NEXTVAL FROM dual;
  SEQ_YASHAN1.NEXTVAL
---------------------
                    1

SELECT seq_yashan1.CURRVAL FROM dual;
  SEQ_YASHAN1.CURRVAL
---------------------
                    1

# USER伪列

USER伪列返回当前登录用户的用户名,返回值类型为VARCHAR(64)。

分布式部署中不支持使用该伪列。

示例

SELECT USER FROM DUAL;