在使用mybatis的时候,如果要往数据库中插入一条数据,你常会见到这么一条语句:SELECTxxxxxx.NEXTVAL AS IDFROM DUAL.你肯定会问,在库中,我没有建立DUAL这张表,这个表是怎么出来的,今天我就来说说DUAL表.
dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录。
一.为什么要引入DUAL表
基本上oracle引入dual为的就是符合语法;
第一.我们先从名称来说,dual不是缩写词,本身就是完整的单词。dual名词意思是对数,做形容词时是指二重的,二元的。
第二.Oracle中的dual表是一个单行单列的虚拟表。
第三.Dual表是oracle与数据字典一起自动创建的一个表,这个表只有1列:DUMMY,数据类型为VERCHAR2(1),dual表中只有一个数据'X',Oracle有内部逻辑保证dual表中永远只有一条数据。
第四.Dual表主要用来选择系统变量或求一个表达式的值。
第五.我们见过:SELECTsysdate FROM daul 而Oracle的SELECT语法的限制为:
SELECT * |[column1 [AS alias1], column2 [AS alias2]] FROM table
所以,没有表名就没有办法查询,而时间日期并不存放在任何表中,于是这个dual虚拟表的概念就被引入了。
二.用途
Dual 是Oracle中的一个实际存在的表,任何用户均可读取,常用在没有目标表的Select语句块中
(1)查看当前连接用户
SQL>select user from dual;
USER
------------------------------
SYSTEM
(2)查看当前日期、时间
SQL>select sysdate from dual;
SYSDATE
-----------
2007-1-24 1
SQL>select to_char(sysdate,''yyyy-mm-dd hh24:mi:ss'') from dual;
TO_CHAR(SYSDATE,''YYYY-MM-DDHH2
------------------------------
2007-01-2415:02:47
(3)当作计算器用
SQL>select 1+2 from dual;
1+2
----------
3
(4)查看序列值
SQL>create sequence aaa increment by 1 start with 1;
SQL>select aaa.nextval from dual;
NEXTVAL
----------
1
SQL>select aaa.currval from dual;
CURRVAL
----------
1
三.测试与分析
DUAL就是个一行一列的表,如果你往里执行insert、delete、truncate操作,就会导致很多程序出问题。
DUAL是属于SYSschema的一个表,然后以PUBLIC SYNONYM的方式供其他数据库USER使用.
SQL>select owner, object_name , object_type from dba_objects where object_name like''%DUAL%'';
OWNEROBJECT_NAME OBJECT_TYPE
--------------------------- ------------------
SYS DUALTABLE
PUBLIC DUALSYNONYM
--查看表结构,只有一个字段DUMMY,为VARCHAR2(1)型
SQL> descdual
Name TypeNullable Default Comments
---------------- -------- ------- --------
DUMMYVARCHAR2(1) Y
--DUAL表的结构:
create tableSYS.DUAL
(
DUMMYVARCHAR2(1)
)
tablespaceSYSTEM
pctfree 10
pctused 40
initrans 1
maxtrans 255
storage
(
initial 16K
next 16K
minextents 1
maxextents505
pctincrease50
);
从这样的表结构来看,DUAL表设计的目的就是要尽可能的简单,以减少检索的开销。
还有,DUAL表是建立在SYSTEM表空间的,第一是因为DUAL表是SYS这个用户建的,本来默认的表空间就是SYSTEM;第二,把这个可能经常被查询的表和用户表分开来存放,对于系统性能的是有好处的。
有了创建了表、创建了同义词还是不够的。DUAL在SYS这个Schema下面,因此用别的用户登录是无法查询这个表的,因此还需要授权:grant selecton SYS.DUAL to PUBLIC with grant option;将Select权限授予公众。