SQLStory摘录(七)————触摸NULL值
来源:互联网 发布:centos traceroute安装 编辑:程序博客网 时间:2024/06/01 22:24
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
前面的文章中,我们初步见识了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,那就清吧,只要你设置了级联约束,就不会有任何离奇的事出现。唯一的后果只是一个无人居住的公寓而已,这不正是我们所要的吗?1<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
前面的文章中,我们初步见识了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,那就清吧,只要你设置了级联约束,就不会有任何离奇的事出现。唯一的后果只是一个无人居住的公寓而已,这不正是我们所要的吗?1<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
- SQLStory摘录(七)————触摸NULL值
- SQL Story摘录(七)————触摸NULL值
- 《SQLStory》摘录五——关系真相
- SQLStory摘录(五)————关系真相
- SQLStory摘录(八)————数据抽取
- SQLStory摘录(三)————可扩展
- SQLStory摘录(九)————不等联接
- SQLStory摘录(六)————不可能的错误
- SQLStory摘录(一)————简单查询初探
- SQLStory摘录(四)————信息挖掘初步
- SQLStory摘录(二)————联接查询初探
- SQLStory摘录(十)————游标的应该与不应该
- 缩写摘录—计算机网络
- Cocos2d-x——触摸事件(单点触摸)
- 七、Java图形化界面设计——布局管理器之null布局(空布局)
- 孙子兵法——精华摘录
- 《乔布斯传》经典摘录(七)
- cocos2d-x——触摸事件(多点触摸)
- SQLStory摘录(六)————不可能的错误
- 窗口类的诞生(注册自己的窗口类一)
- SQLStory摘录(八)————数据抽取
- 窗口类的诞生(注册自己的窗口类二)
- 用JavaScript编制显示日期和中文星期
- SQLStory摘录(七)————触摸NULL值
- struts傻瓜式学习(一天篇)
- SQLStory摘录(一)————简单查询初探
- 111111
- 一个画图类,类似ms_chart的线图,适用于科学仿真数据分
- 简单hql语句
- SQLStory摘录(四)————信息挖掘初步
- C++之路
- linux下的播放器