|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
EXAMPLE存储引擎是一个不做任何事情的存根引擎。它的目的是作为MySQL源代码中的一个例子,用来演示如何开始编写一个新存储引擎。同样,它的主要兴趣是对开发者。EXAMPLE存储引擎不支持编索引。
后面的文章中,我们开端见地了NULL这个难以想象的小器材。明天,我尽量具体的先容一下它。按照常规,这是一次只管浅易但其实不松散的会商,乃至大概内容也不那末严厉。我的目标在于匡助读者更轻松地事情,而且有乐趣对数据库进一步的进修。从另外一方面讲,我信任本人论点中的毛病,一定会有其别人也在犯,以是请发明不当的伴侣必定要公然指出。如许,才有助于我和我的读者伴侣们前进。衷心感激每个提出品评和斧正的伴侣,出格是公然提出品评和斧正的伴侣们。出格感激sunshine19,特地发来E-mail,指出了《SQLStory》的各种不敷,并提出了可贵定见。我希冀他持续体贴这个专题,并希冀他为我们带来优异的作品。
无可躲避的不存在
例:双人房间。
假定某个黉舍,它的只身职工公寓中,每一个房间有两个床位。如许做有良多优点,好比平安,都是半年夜不小的年老人,不论男孩女孩,有个伴一同住总让人宁神些,相互也有个呼应;假如有谁结了婚,因为每一个房间最多住两团体,还能够对照简单地找出一间,先给他们安个家,渐渐等着分房。这些事固然不要我们程序员多费心(除非我们就住在内里)。如今要体贴的是,有人做了一个公寓办理数据库。个中的房间办理表如许子计划:
CREATETABLEROOMS(
ROOMIDCHAR(5),
MASTERIDCHAR(10),
SECONDIDCHAR(10),
CONSTRAINTPK_ROOMPRIMARYKEY(ROOMID),
CONSTRAINTFK_MASTERFOREIGNKEY(MASTERID)REFERENCESLIVERS(ID),
CONSTRAINTFK_SECONDFOREIGNKEY(SECONDID)REFERENCESLIVERS(ID)
)
复杂先容一下,办理员为了便利办理(好比收个水电费甚么的),请求每个住人的房间有一个房东;两团体更具体的信息保留在了LIVERS表中,以是我们看到有两个外键束缚。固然,这个计划并不是自作掩饰,不外它也自有它的来由,在这里我们先不会商了。
这里要存眷的是,佃农少于两团体的房间,我们该在空出来的中央填甚么?有一个办法,就是填进一个空字符串,可如许一来,就即是我们默许了存在一个ID号为空字符串的住户存在。由于空字符串也是字符串嘛。两个外键束缚也申明了这一点。现实上,在相似如许的计划中,我就见过一些例子,其作者为了不无可援用的情形,平空造出一个不存在的信息,做为数据库布局的一部分。详细到这个例子,大概会有人真的用一个空字符串或写一个“NONE”甚么的,写在LIVERS表中,暗示没有人寓居。一般这会引发良多成绩,好比我们大概要加一个束缚,使得一团体不克不及呈现在ROOMS表中两次。可如今这个假造出来暗示没有人的佃农怎样办?可有良多地位都没有人啊,好比只需有一个空屋,就会在这一笔记录上有两个“NONE”!在更古怪(但在某些使用中尽非不成能)的情形下,有一个佃农,他的ID就是“NONE”,怎样??并且假如极度情形下,佃农全搬进来了,怎样办?想要“DELETFROMLIVERS”都不可,“NONE”可删不失落啊。当你事情在如许一个数据库中,得不时提示本人不要冒犯了这个不存在的家伙。要记着,他没有性别,以是男女职工的房间他都要住;他人一团体只能睡一张床,他却能够要一切余暇的;他人都搬进来后,他白叟家一团体占了一切的房间,我们的功令规章对他全没成心义。这类特别值给我们带来的最年夜成绩,就是把信息和数据库布局搅在了一同。也就是说,干系和干系的形式等量齐观了。假如一个数据库中有上几个这类表,谁城市疯的。
这就是NULL的意义,当你把一个数据界说为NULL时,就即是告知体系,这个数据不存在,或未知。不要管它了,它的内容没成心义(固然,这自己也是一种意义)。在房间中有一个NULL,只暗示没有人,而不会被以为是一个叫“没有人”的人住在内里。更不会有一个占领了一切房间的恶客存在。要清空LIVERS,那就清吧,只需你设置了级联束缚,就不会有任何古怪的事呈现。独一的成果只是一个无人寓居的公寓罢了,这不恰是我们所要的吗?
NULL是实在存在的,只管从某种意义上讲,我们没法注释它的存在。它是干系天下的黑洞。大概会让一些人不恬逸,但躲避它只会给我们带来更多的贫苦。
看不见摸不到
在《SQL-3参考年夜全》中,作者如许注释NULL的寄义:未知或不决义。对NULL来讲,有良多风趣的特征。
NULL是一个数据值,并且它属于一个域(?)。是的,比方一个字符串字段,个中的空值只能是一个字符串。只管它的内容没有界说,大概未知,但它是字符串,这一点无可置疑。
NULL不长短法数据,这一点SQL-3尺度也说的很分明。我们没有举措保留零分之一,但能够保留空值。固然它是空值,是不决义,是未知,可它也切实其实是一个正当的信息。
运算黑洞:关于NULL,一样平常的运算城市前往NULL。好比加减乘除,这几乎就是一个黑洞一样。永久不会有甚么数据即是NULL。固然,1不即是NULL,2也一样。但是,NULL也不即是NULL。说一个NULL即是NULL是毛病的。以是我们只能对照它“是”或“不是”。为了不凌乱,SQL-3尺度有一些商定。好比表达式x=NULL,了局应该是UNKOWN。而表达式“xisNULL”,就得看情形,假如x是NULL或False,就前往Ture(?);x长短NULL,前往False。有点奇异是否是,它基于NULL不即是NULL。这个划定规矩切实其实为SQL尺度所撑持,碰到如许的数据库体系,可不要感应惊奇。
三值逻辑:《鹿鼎记》中的韦小宝,整人的法门之一就是“我问你话,是就摇头,不是就点头,不准你作声!”切实其实,一般我们的逻辑概念,老是基于这类二值逻辑系统,对就是对,错就是错。可在干系实际中,没有这么复杂。有一种没有相对长短的情形存在:NULL。这就是干系实际的三值逻辑。
另有一些罕见的与NULL相干的情形。好比,统计函数(也有的文档称之为会萃函数、集函数)一般会疏忽NULL。不外,假定有如许一个表T:
C
-----
1
2
NULL
NULL
我们分离实行两个查询:SELECTCOUNT(*)FROMT和SELECTCOUNT(C)FROMT,猜猜会有甚么分歧?后来,我觉得两个了局应该一样。了局,前一个是4,后一个是2。前一个即是4,明显基于NULL也是数据这个现实;尔后一个了局为2,是因为统计C列时,COUNT疏忽了NULL。
SQL-3尺度中,搜刮前提(WHERE和HAVING)只承受TRUE,而束缚却只回绝FALSE,两者对NULL的承受立场相反。以是我们后面见到的ROOMS表才能够把空值写进职员字段。而在排序时,却又没甚么纪律。SQL尺度只作出了一个增补界说,以是每一个DBMS的处置ORDERBY的办法其实不不异,固然NULL不是高于一切值就是低于一切值。
在《SQL-3参考年夜全》中先容了更具体的关于NULL的内容。别的,书中还先容了两位数据库专家C.J.Date和E.f.Codd关于NULL的分歧论点(E.F.Codd乃至但愿有四值逻辑)有乐趣的伴侣能够找来一读。在理论中,我们还会碰到一些风趣的事,出格是连接查询中,NULL让我们的人生变得“丰厚多彩”。
因为各种缘故原由,近几天我大概会加快写作速率,但这其实不代表我会保持。在休整和充电以后,我会回到我所善于的实战范畴。再次感激每位体贴《SQLStory》的读者。
对于insert操作,只需要把event_type改成DELETE_ROWS_EVENT;对于delete操作,改成WRITE_ROWS_EVENT |
|