暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

原创 陈举超 1天前
35

问题背景:

某位朋友反馈,达梦数据库查询数据指定别名查询失败,提示无效的别名。
当看见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

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论