ITPub博客

首页 > 数据库 > 国内数据库 > 国产数据库,可以使用 rowid 关键字作为列别名吗?

国产数据库,可以使用 rowid 关键字作为列别名吗?

原创 国内数据库 作者:chenoracle 时间:2026-09-18 16:18:03 0 删除 编辑

问题背景:

某位朋友反馈,达梦数据库查询数据指定别名查询失败,提示无效的别名。
当看见SQL语句使用的别名时,很不理解,为什么用 rowid作为别名?

SQL> select id as rowid from cjc.t0601;
select id as rowid from cjc.t0601;
第1 行附近出现错误[-2113]:无效的别名[ROWID].
已用时间: 0.385(毫秒). 执行号:0.

rowid 是达梦、Oracle的关键字,不建议用于别名。

达梦数据库:

SQL> SELECT * FROM V$RESERVED_WORDS WHERE UPPER(KEYWORD) LIKE 'ROW%';
行号     KEYWORD         LENGTH      RESERVED RES_SQL RES_PL RES_SCHEMA RES_VARIABLE RES_ALIAS RES_FIXED
---------- --------------- ----------- -------- ------- ------ ---------- ------------ --------- ---------
1          ROW             3           Y        Y       Y      N          N            N         Y
2          ROWCOUNT        8           N        N       N      N          N            N         N
3          ROWDEPENDENCIES 15          N        N       N      N          N            N         N
4          ROWNUM          6           Y        Y       Y      N          N            N         Y
5          ROWS            4           Y        Y       Y      N          N            N         Y
6          ROWID           5           N        N       N      N          N            N         N
6 rows got
已用时间: 1.754(毫秒). 执行号:97701.

Oracle数据库:

SQL> desc V$RESERVED_WORDS;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 KEYWORD                                            VARCHAR2(30)
 LENGTH                                             NUMBER
 RESERVED                                           VARCHAR2(1)
 RES_TYPE                                           VARCHAR2(1)
 RES_ATTR                                           VARCHAR2(1)
 RES_SEMI                                           VARCHAR2(1)
 DUPLICATE                                          VARCHAR2(1)
SQL> SELECT * FROM V$RESERVED_WORDS WHERE UPPER(KEYWORD) LIKE 'ROW%';
KEYWORD                            LENGTH R R R R D
------------------------------ ---------- - - - - -
ROWIDTOCHAR                            11 N N N N N
ROWID                                   5 N N N Y N
ROWS                                    4 N N N Y N
ROW_LENGTH                             10 N N N N N
ROWDEPENDENCIES                        15 N N N N N
ROW_NUMBER                             10 N N N N N
ROWNUM                                  6 N N N Y N
ROWIDTONCHAR                           12 N N N N N
ROW                                     3 N N N Y N
9 rows selected.

问题分析:

首先肯定是不建议用 rowid 作为列别名的,那么如果非要这么做,有什么解决办法吗?
下面分别测试了 达梦、金仓、Oracle、MySQL 使用rowid作为列别名,看看能否正常查询:

达梦数据库:

测试结果:默认参数下,不能使用rowid作为列别名。
也可能是我没找对方法,知道的朋友请留言。

create table cjc.t0601(id int);
insert into cjc.t0601 values(1);
commit;

用 rowid 作为列别名,在默认参数下,就算添加了 双引号、反引号 也无法正常查询。

SQL> select id as rowid from cjc.t0601;
select id as rowid from cjc.t0601;
第1 行附近出现错误[-2113]:无效的别名[ROWID].
已用时间: 0.385(毫秒). 执行号:0.
SQL> select id as "rowid" from cjc.t0601;
select id as "rowid" from cjc.t0601;
第1 行附近出现错误[-2113]:无效的别名[rowid].
已用时间: 0.320(毫秒). 执行号:0.
SQL> select id as `rowid` from cjc.t0601;
select id as `rowid` from cjc.t0601;
第1 行附近出现错误[-2113]:无效的别名[rowid].
已用时间: 0.312(毫秒). 执行号:0.
SQL> select rowid,id from cjc.t0601;
行号     ROWID              id         
---------- ------------------ -----------
1          AAAAAAAAAAAAAAAAAB 1
已用时间: 0.744(毫秒). 执行号:3066708.

金仓数据库:

金仓数据库没有ROWID,对应的是CTID,可以使用 ROWID 作为列别名。

kingbase=# create table t0601(id int);
CREATE TABLE
kingbase=# insert into t0601 values(1);
INSERT 0 1
kingbase=# select id from t0601;
 id 
----
  1
(1 row)

可以正常查询

kingbase=# select id as rowid from t0601;
 rowid 
-------
     1
(1 row)

也可也添加双引号

kingbase=# select id as "rowid" from t0601;
 rowid 
-------
     1
(1 row)

Oracle 数据库:

不支持直接使用 ROWID 作为列别名,但是 加上 双引号可以正常查询。

SQL> select id as rowid from cjc.t0601;
select id as rowid from cjc.t0601
             *
ERROR at line 1:
ORA-00923: FROM keyword not found where expected
SQL> select id as "rowid" from cjc.t0601;
     rowid
----------
         1
SQL> select rowid,id from cjc.t0601;
ROWID                      ID
------------------ ----------
AAAYmQAAFAAAAZHAAA          1

MySQL数据库:

支持直接使用 ROWID 作为列别名

mysql> use cjc;
Database changed
mysql> create table cjc.t0601(id int);
insert into cjc.t0601 values(1);
commit;Query OK, 0 rows affected (0.06 sec)
mysql> insert into cjc.t0601 values(1);
Query OK, 1 row affected (0.02 sec)
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
mysql> select id as rowid from cjc.t0601;
+-------+
| rowid |
+-------+
|     1 |
+-------+
1 row in set (0.00 sec)
mysql> select id as "rowid" from cjc.t0601;
+-------+
| rowid |
+-------+
|     1 |
+-------+
1 row in set (0.00 sec)
mysql> select id as `rowid` from cjc.t0601;
+-------+
| rowid |
+-------+
|     1 |
+-------+
1 row in set (0.00 sec)

欢迎关注我的公众号《 IT小Chen》


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29785807/viewspace-3182993/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
Oracle ACE、OCMU 用户组成员、Oracle 11g OCM、微信公众号"IT小Chen"

注册时间:2014-08-05

  • 博文量
    853
  • 访问量
    2721899