本文主要介绍sql server中处理空值涉及的三个问题:计数、使用空表值和外键处理。
带计数的句柄空值(*)
大多数聚合函数在计算时都可以消去空值;COUNT函数是一个例外。对包含空值的列使用COUNT函数,将从计算中消除空值。但是如果COUNT函数使用星号,它将对所有行进行计数,而不管空值是否存在。
如果希望COUNT函数对给定列的所有行进行计数(包括空值),请使用ISNULL函数。ISNULL函数将用有效值替换空值。
其实对于聚合函数来说,如果空的值可能导致错误的结果,ISNULL函数是非常有用的。请记住,当使用星号时,COUNT函数将计算所有行。以下示例演示了avg和COUNT聚合函数中空值的影响:
以下是引用的内容:
设置NOCOUNT ON
GO
创建表xCount
(pkey 1 INT IDENTITY NOT NULL
约束pk_xCount主键,
col 1 INT NULL)
GO
INSERT xCount(col 1)VALUES(10)
GO
INSERT xCount(col 1)
WIsNullFnctnCol1使用星号
- - - -
15 11 3 4 4
SQL Server中可能存在一种特殊情况:在引用父表的表中,不允许使用空值,因此“声明参照完整性(DRI)”可能不会强制执行。即使父表不包含空值,其子表引用父表的主键约束或唯一约束的列也可能包含空值。
如果父表中的值当前未知,则不会有问题。例如,父表可以是地址表,而子表可以包含联系信息。由于许多原因,要传递给父表的联系地址可能暂时不知道。这是一个基于时间的问题,其中空的值可能比较合适。
如下面的示例所示,我们创建父表并向其中插入两个值。
以下是引用的内容:
SET NOCOUNT ON
GOCREATE表父级(pkey1 INT IDENTITY不为空
约束pkParent主键,col1 INT NULL)GOINSERT
父(列1)值(284)GOINSERT
父(列1)值(326)GO
下面的代码创建一个子表,并在引用父表的列中插入一个空值。以下是引用的内容:
创建子表
(pkey 1 INT identity constraint PK child
主键,parent pkey 1 INT null constraint fkchild parent
外键引用父级(pkey1),列1 INT NULL)
GOINSERT子级(Parentpkey1,col1)值(null,2)GO
但是,在下面的代码中,您希望从父表和子表中选择值。虽然父表不包含空值,但是在子表引用父表的列中允许有空值。然后丢弃所有表并清除本演示中使用的数据库对象。
SELECT * FROM childgo SELECT * FROM ParentGO drop表Child,parent go
您可以检查外键空中数据的有效性
如果两列一起形成主键,并且子表继承主键作为外键,值为空,则可能会获得错误的数据。您可以在一个外键列中插入有效值,但在另一个外键列中插入空值。然后,可以添加数据表检查约束来检查外键中数据的有效性,外键可以是空。
任何多列外键都可能遇到同样的问题。因此,您需要添加一个检查约束来检测异常。最初,check约束将检查组成外键的所有列中空的可能值。该检查还会检查这些列中不能为空的值。如果两个检查都通过了,问题就解决了。
以下示例脚本显示了此类异常以及如何通过检查约束来纠正它。
关键词:SQLServer
优侠库网站每天提供最新最热门的安卓手机软件、游戏下载、分享热门手游资讯攻略教程、手机软件教程步骤,专注安卓手机游戏软件下载。本文链接:http://www.123down.cn/gonglue/227272.html