当存在rowid同名用户列时,如何获取rowid伪列及影子列?
问题描述
用户创建了如下数据表:
CREATE or replace TABLE t (id INT, content STRING, rowid INT); INSERT INTO t VALUES (42, 'hello', 5), (43, 'world', 5);
需要编写查询语句,同时取出数据库的rowid伪列和名为rowid的用户自定义列,类似如下结构:
select id, content, rowid, ?rowid-pseudocolumn? from t;
另外还想了解:一般情况下,当用户列与影子列(伪列)同名时,如何获取对应的影子列?
解决方案
不同数据库对伪列(影子列)的命名和引用规则不同,以下是几种常见数据库的处理方式:
SQLite
SQLite中rowid伪列有两个别名:oid和_rowid_。当用户自定义了rowid列时,可通过这两个别名引用原生伪列:
select id, content, rowid, _rowid_ from t;
或使用oid:
select id, content, rowid, oid from t;
这两个别名会返回原生行标识符,与用户自定义的rowid列互不冲突。
Oracle
Oracle中的ROWID伪列若与用户列同名,直接引用会优先取用户列,此时可通过表名限定来指定伪列:
select id, content, rowid, t.ROWID from t;
也可使用全称格式:
select id, content, rowid, SYS.ROWID from t;
表名限定的方式更常用,清晰明确。
MySQL
MySQL的InnoDB引擎没有直接可查询的rowid伪列,若表无主键或唯一非空键,会隐式生成6字节的ROW_ID伪列,但常规SQL无法直接查询该伪列。用户自定义的rowid列可直接查询。
通用原则
当用户列与伪列同名时,通常有两种解决思路:
- 使用伪列的别名:多数数据库会给伪列提供备用名称,避免与用户列冲突,比如SQLite的
_rowid_/oid。 - 使用限定符:通过表名、schema名或系统命名空间限定伪列,明确指定要引用的是系统伪列而非用户列,比如Oracle的
t.ROWID。
内容的提问来源于stack exchange,提问作者David542
相关产品推荐
相关产品推荐

