YashanDB 伪列
伪列的行为类似于普通列,但其数据并不存储在表中。用户可以 SELECT 伪列,但不能对伪列进行 INSERT、UPDATE、DELETE 操作。
YashanDB 存在如下五种伪列:
ROWSCN
ROWID
ROWNUM
SEQUENCE
USER
ROWSCN 伪列
ROWSCN 伪列表示行最后一次被修改的 SCN。YashanDB 的 ROWSCN 为页面级别,一般情况下返回的 ROWSCN 是行所在页面最后一次修改并提交的 BLOCK SCN,若使用特殊查询条件可能会返回该行最后一次修改并提交的 SCN,例如使用 ROWID 为查询条件时。
若事务修改了表中某行数据并提交了修改,后续查询该行的 ROWSCN 时,返回值仅会大于或等于修改前的 ROWSCN。
该伪列仅适用于 HEAP 表。
示例(HEAP 表)
ROWID 伪列
ROWID 伪列表示行所在的地址。ROWID 伪列的类型为 ROWID 类型,使用限制等更多说明请查阅ROWID UROWID。
该伪列仅适用于 HEAP 表。
示例(HEAP 表)
ROWNUM 伪列
ROWNUM 伪列是系统顺序分配的查询返回的行编号,返回的第一行分配为 1,第二行分配为 2,依此类推。该伪列可用于限制查询返回的总行数。
分布式部署中不可使用该伪列。
ROWNUM 在列存表中的使用限制如下:
ROWNUM 只能与常量进行比较。
条件语句中不能使用小于、小于等于、大于或大于等于运算符。
使用等值比较时,ROWNUM 所比较的对象只能为常量 1。
不允许 ROWNUM 在 or 的左右条件中使用。
ROWNUM 在过滤条件中只能使用一次,且只能单独使用,不允许参与运算或作为函数入参。
ROWNUM 不能出现在非比较谓词和不等于比较中,例如 in。
在外连接的连接条件中不可使用 ROWNUM。
ROWNUM 伪列的常用场景:
WHERE 条件中做行数限制
WHERE ROWNUM < 常数,返回常数-1 行的记录。
WHERE ROWNUM = 常数,ROWNUM 从 1 开始累加,因此 ROWNUM= 1 可以返回 1 条记录;当 ROWNUM = 任何非 1 值时,条件恒为 FALSE,无法返回任何结果。
WHERE ROWNUM > 常数,常数小于 1,则条件恒为 TRUE;常数大于等于 1,则条件恒为 FALSE(即查询结果恒为空)。
示例(HEAP 表)
ROWNUM 与 ORDER BY 一起使用
先从表中取出符合 ROWNUM 条件的行然后再进行排序,其结果取决于执行计划,执行计划不同可能会导致取得的行不同。
示例(单机、共享集群部署)
ROWNUM 与 JOIN 一起使用
在 JOIN 语句中,ROWNUM 与在 WHERE 中使用相同的规则判断。
使用 ROWNUM 给表中每一行附上唯一的值
示例(单机、共享集群部署)
SEQUENCE 伪列
SEQUENCE 伪列是创建序列对象时生成的唯一序列号,可分为如下两种类型:
CURRVAL:返回当前序列号值,即当前 session 上一次获取到的 NEXTVAL 值。
NEXTVAL:增加序列号的值并返回序列的 NEXTVAL。
分布式部署中不可使用该伪列。
获取序列号:
获取指定 schema 的序列号:
dblink 获取远端序列号:
可以在以下场景使用 CURRVAL 伪列与 NEXTVAL 伪列:
SELECT 语句中被查询的列中不包含子查询的场景
INSERT 语句中的 SELECT 从句
INSERT 语句中的 VALUES 从句
UPDATE 语句中的 SET 从句
禁止使用的场景:
DELETE、SELECT、UPDATE 语句中的子查询语句
带有 DISTINCT 算子的 SELECT 语句
带有 GROUP BY 或 ORDER BY 子句的 SELECT 语句
多个 SELECT 语句通过 UNION 集合
SELECT 语句中的 WHERE 子句
对于某一个序列号,在使用 CURRVAL 伪列前,同一会话中必须先通过 NEXTVAL 伪列完成 CURRVAL 值的初始化。
示例(单机、共享集群部署)
用以下语法获取序列号:
USER 伪列
USER 伪列返回当前登录用户的用户名,返回值类型为 VARCHAR(64)。
分布式部署中不可使用该伪列。
示例(单机、共享集群部署)
版权声明: 本文为 InfoQ 作者【YashanDB】的原创文章。
原文链接:【http://xie.infoq.cn/article/dda36ed8912e8970be8a6963a】。文章转载请联系作者。
评论