You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

当存在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 15:33:19