唐山网站建设

设为主页 加入收藏 繁體中文

SQL Server数据库中处理空值常常见题目

核心提示:数据完全性是任何数据库系统要保证的重点。不管系统计划得有多好,空数据值的题目总是存在。本文探讨了在SQL Server中处理这些值时触及的3个题目:计数、使用空表值和外键处理。

数据完全性是任何数据库系统要保证的重点。不管系统计划得有多好,空数据值的题目总是存在。本文探讨了在SQL Server中处理这些值时触及的3个题目:计数、使用空表值和外键处理。

用COUNT(*)处理空值

大多数集合函数都能在计算时消除空值;COUNT函数则属于例外。对包括空值的1个列使用COUNT函数,空值会从计算中消除。但假设COUNT函数使用1个星号,它就计算所有行,而不论是否是存在空值。

假设希看COUNT函数对给定列的所有行(包括空值)进行计数,请使用ISNULL函数。ISNULL函数会将空值替换成有效的值。

事实上,对集合函数来讲,假设空值可能导致毛病结果,ISNULL函数就非常有用。记住在使用1个星号时,COUNT函数会对所有行进行计算。下例演示了空值在AVG和COUNT集合函数中的影响:

以下为援用的内容:
SET NOCOUNT ON
            GO
            CREATE TABLE xCount
            (pkey1 INT IDENTITY NOT NULL
            CONSTRAINT pk_xCount PRIMARY KEY,
            Col1 int NULL)
            GO
            INSERT xCount (Col1) VALUES (10)
            GO
            INSERT xCount (Col1) VALUES (15)
            GO
            INSERT xCount (Col1) VALUES (20)
            GO
            INSERT xCount (Col1) VALUES (NULL)
            GO
            SELECT AVG(Col1) AvgWithoutIsNullFunctionOnCol1,
            AVG(ISNULL(Col1,0)) AvgWithIsNullFunctionOnCol1,
            COUNT(Col1) NoIsNullFunctionOnCol1 ,
            COUNT(ISNULL(Col1,0)) UsingIsNullFunctionOnCol1,
            Count(*) UsingAsterisk
            FROM xCount
            GO
            DROP TABLE xCount
            GO
            OUTPUT:
            AvgWOIsNullFnctnCol1 AvgWIsNullFnctnCol1
            WOIsNullFnctnCol1
            WIsNullFnctnCol1 UsingAsterisk
            ---------------- ------------- --------------

 
恰当使用空表值

SQL Server可能出现1种特殊情况:在援用父表的1个表中,由于不答应空值,所以“声明援用完全性”(DRI)可能不会得到强迫。即使父表不包括空值,在子表援用了父表主键束缚或惟1束缚的列中,也可能包括空值。

假设来自父表的值目前未知,就不会有任何题目。例如,父表多是1个地址表,而子表可能包括联系信息。由于很多缘由,可能暂时不知道要传给父表的联系地址。这是1种基于时间的题目,空值在其中或许是合适的。

以下例所示,我们创建父表,并在其中插进两个值。

以下为援用的内容:
SET NOCOUNT ON
            GOCREATE TABLE Parent(pkey1 INT IDENTITY NOT NULL
            CONSTRAINT pkParent PRIMARY KEY,col1 INT NULL)GOINSERT
            Parent (col1) VALUES (284)GOINSERT
            Parent (col1) VALUES (326)GO

以下代码则创建子表,并在援用父表的列中插进1个空值。

以下为援用的内容:
CREATE TABLE Child
            (pkey1 INT IDENTITYCONSTRAINT pkChild
            PRIMARY KEY,Parentpkey1 INT NULLCONSTRAINT fkChildParent
            FOREIGN KEYREFERENCES Parent(pkey1),col1 INT NULL)
            GOINSERT Child (Parentpkey1, col1) VALUES (null,2)GO

 
但在以下代码中,要同时从父表和子表选择值。固然父表不包括空值,但在子表援用了父表的那个列中,将答应1个空值。

然后抛弃所有表,清除这个演示所用的数据库对象。

以下为援用的内容:
SELECT * FROM ChildGOSELECT * FROM
            ParentGODROP TABLE Child, ParentGO

 
在可以为空的外键中检查数据的有效性

假设由两个列共同组成主键,而且1个子表将主键作为可为空值的外键来继续,便可能得到毛病的数据。可在1个外键列中插进有效的值,但在另1个外键列中插进空值。然后,可添加1个数据表检查束缚,在可为空的外键中检查数据的有效性。

任何多列外键都可能碰到一样的题目。所以,你需要添加1个检查束缚来检测异常。最初,检查束缚将检查构成外键的所有列中可能为空的值。检查束缚还要检查这些列中不能为空的值。如两个检查都通过,题目就解决了。

以下示范脚本展现了这样的1个异常,和如何用检查束缚来纠正它。

空值是所有数据库开发者和治理员都要碰到的。所以,要想开发成功的利用程序,必须知道如何处理这些值。本文和你分享了空值处理的1些技能和技术。

http://www.fw8.net/
TAG:数据,内容,题目,函数,完全性
评论加载中...
内容:
评论者: 验证码: