|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
两个到底是哪一个给出了MySQL这个名字至今依然是个迷,包括开发者在内也不知道。
题目奥秘的DUALblack_snail(原作)
关头字ORACLEDUAL
DUAL?有甚么奥秘的?当你想失掉ORACLE体系工夫,简复杂单敲一行SQL
不就得了吗?故弄玄虚….
SQL>selectsysdatefromdual;
SYSDATE
---------
28-SEP-03
哈哈,的确DUAL的利用很便利.可是人人晓得DUAL倒底是甚么OBJECT,它有甚么特别的举动吗?来,我们一同看一看.
起首弄分明DUAL是甚么OBJECT:
SQL>connectsystem/manager
Connected.
SQL>selectowner,object_name,object_typefromdba_objectswhereobject_namelike%DUAL%;
OWNEROBJECT_NAMEOBJECT_TYPE
-------------------------------------------
SYSDUALTABLE
PUBLICDUALSYNONYM
本来DUAL是属于SYSschema的一个表,然后以PUBLICSYNONYM的体例供其他数据库USER利用.
再看看它的布局:
SQL>descdual
NameNull?Type
-----------------------------------------------------------------------------
DUMMYVARCHAR2(1)
SQL>
只要一个名字叫DUMMY的字符型COLUMN.
然后查询一下内外的数据:
SQL>selectdummyfromdual;
DUMMY
----------
X
哦,只要一笔记录,DUMMY的值是’X’.很一般啊,没甚么奇异嘛.好,上面就有奇奥的器材呈现了!
拔出一笔记录:
SQL>connectsysassysdba
Connected.
SQL>insertintodualvalues(Y);
1rowcreated.
SQL>commit;
Commitcomplete.
SQL>selectcount(*)fromdual;
COUNT(*)
----------
2
迄今为止,统统一般.但是当我们再次查询纪录时,奇异的事变产生了
SQL>select*fromdual;
DUMMY
----------
X
方才拔出的那笔记录并没有显现出来!明显DUAL表中有两笔记录,可就是只显现一条!
再试一下删除,狠一点,全删光!
SQL>deletefromdual;/*注重没无限定前提,试图删除全体纪录*/
1rowdeleted.
SQL>commit;
Commitcomplete.
哈哈,也只要一笔记录被删失落,
SQL>select*fromdual;
DUMMY
----------
Y
为何会如许呢?岂非SQL的语法对DUAL不起感化吗?带着这个疑问,我查询了一些ORACLE官方的材料.本来ORACLE对DUAL表的操纵做了一些外部处置,只管包管DUAL表中只前往一笔记录.固然这写外部操纵是不成见的.
看来ORACLE真是储藏着无量的奇妙啊!
附:ORACLE关于DUAL表分歧平常特征的注释
Thereisinternalizedcodethatmakesthishappen.Codechecksthatensure
thatatablescanofSYS.DUALonlyreturnsonerow.Svrmgrlbehaviouris
incorrectbutthisisnowanobsoleteproduct.
Thebaseissueyoushouldalwaysrememberandkeepis:DUALtableshouldalways
have1ROW.Dualisanormaltablewithonedummycolumnofvarchar2(1).
Thisisbasicallyusedfromseveralapplicationsasapseudotablefor
gettingresultsfromaselectstatementthatusefunctionslikesysdateorother
prebuiltorapplicationfunctions.IfDUALhasnorowsatallsomeapplications
(thatuseDUAL)mayfailwithNO_DATA_FOUNDexception.IfDUALhasmorethan1
rowthenapplications(thatuseDUAL)mayfailwithTOO_MANY_ROWSexception.
SoDUALshouldALWAYShave1andonly1row
出于效率方面的考虑,InnoDB数据表的数据行级锁定实际发生在它们的索引上,而不是数据表自身上。显然,数据行级锁定机制只有在有关的数据表有一个合适的索引可供锁定的时候才能发挥效力。 |
|