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

GBase 8a数据库中的DUAL表

原创 手机用户2206 2023-05-29
571

DUAL表是数据库中最小的内部表。很多数据库,包括GBase 8a、Oracle、MySQL等都视其为虚拟表。

DUAL表只有一行一列。其列名为“DUMMY”,其在GBase 8a数据库中的数据类型为:VARCHAR(1)。其仅有一行数据,其数据内容为大写的“X”。如下图:

gbase> select * from gclusterdb.dual;
+-------+
| dummy |
+-------+
|   X   |
+-------+
1 row in set (Elapsed: 00:00:00.12)

DUAL表的列名、数据类型的长度,以及表内数据均可以修改,但因其是虚拟表,修改字段名称和长度及数据并无实际意义。为符合DUAL表的使用惯例,其格式和内容,不建议修改。如果用户误删除该表,可以人为手动创建该表,其使用效果不受影响。

一、权限

DUAL表存储在GBase 8a数据库的gclusterdb系统库中,普通用户无访问、修改gclusterdb.dual表的权限,数据库管理员“root”账户可以修改。普通用户须管理员“root”账户赋权后才能访问。

示例:

[gbase@181 ~]$ gccli -u test
GBase client 9.5.2.42.128678. Copyright (c) 2004-2023, GBase. All Rights Reserved.
gbase> select 1 from dual;
ERROR 1142 (42000): SELECT command denied to user 'test'@'localhost' for table 'dual'

注:“test”用户是普通用户,并没有专门为“test”用户分配dual的相关权限。当使用“test”用户登录数据库后,使用“test”用户查询dual表被提示该用户被拒绝。

解决办法:使用管理员账户“root”为“test”用户分配权限后,该表可查。

示例:

[gbase@181 ~]$ gccli -u root
GBase client 9.5.2.42.128678. Copyright (c) 2004-2023, GBase. All Rights Reserved.

注:使用“root”账户登录数据库。

gbase> grant select on gclusterdb.dual to test;
Query OK, 0 rows affected (Elapsed: 00:00:00.10)

注:分配针对gclusterdb系统库的dual表select查询权限给“test”用户。

验证结果:

[gbase@181 ~]$ gccli -u test
GBase client 9.5.2.42.128678. Copyright (c) 2004-2023, GBase. All Rights Reserved.

注:使用被分配select权限的“test”用户登录。

gbase> select 1 from dual;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (Elapsed: 00:00:00.64)

注:查询dual表,可以显示结果。

二、DUAL表的使用场景

1、DUAL表可用于计算常量表达式值、函数等。

示例:

gbase> select now() from dual;
+---------------------+
| now()               |
+---------------------+
| 2023-04-03 16:49:46 |
+---------------------+
1 row in set (Elapsed: 00:00:00.03)

注:

①普通用户默认虽无访问gclusterdb.dual表权限,无法操作该表,但在计算常量表达式或函数时省略“from dual”仍能运行。

如下图:

[gbase@181 ~]$ gccli -u test
GBase client 9.5.2.42.128678. Copyright (c) 2004-2023, GBase. All Rights Reserved.
gbase> select now() from dual;
ERROR 1142 (42000): SELECT command denied to user 'test'@'localhost' for table 'dual'
gbase> select now();
+---------------------+
| now()               |
+---------------------+
| 2023-04-07 00:44:42 |
+---------------------+
1 row in set (Elapsed: 00:00:00.01)

②甚至gclusterdb.dual表没有生成(未完成集群初始化)或被管理员意外删除,所有用户无法使用虚拟表时,省略“from dual” 仍能运行。

示例:

[gbase@181 ~]$ gccli -u root
GBase client 9.5.2.42.128678. Copyright (c) 2004-2023, GBase. All Rights Reserved.
gbase> drop table gclusterdb.dual;
Query OK, 0 rows affected (Elapsed: 00:00:00.19)
gbase> select 3*7 from dual;
ERROR 1146 (42S02): Table 'finance_vc.gclusterdb.dual' doesn't exist

gbase> select 3*7 ;

+-----+
| 3*7 |
+-----+
| 21  |
+-----+
1 row in set (Elapsed: 00:00:00.00)

总结:

对于计算常量表达式值和函数等,使用DUAL表并不是唯一选择,反而不使用DUAL表的执行开销会更低,因为DUAL表会尝试生成执行计划。

2、DUAL表多用于必须有from的语法结构中,如:子查询。

示例:

gbase> insert into test select 1111,'abc','text' from dual;
Query OK, 1 row affected (Elapsed: 00:00:00.10)
Records: 1 Duplicates: 0 Warnings: 0

此例中向test表写入一行数据。而数据内容并非是从某张实际表中查询而出,而是借助虚拟表,将指定数据写入对应的test表中。此时使用的select子查询,只是变换了种数据插入的形式。从语法结构上,select子查询为符合语法标准必须要有“from”,而该例中因为查询的表并不是真实的表,而是虚拟表出来的表和数据,所以必须在此引用DUAL。该用法也是DUAL表的惯常用法。

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

评论