SQL Server处理空值操作中的3大问题有哪些?

数据库 SQL Server
我们今天主要向大家讲述的是SQL Server处理空值的实际操作过程中,我们所要涉及的三个相关问题,以下就是文章的主要内容描述。

以下的文章主要向大家描述的是SQL Server处理空值的实际操作过程中我们所要涉及的三个问题,我们大家都知道数据完整性是任何数据库系统要保证的重点。不管系统计划得有多好,空数据值的问题总是存在。

本文探讨了在SQL Server中处理这些值时涉及的3个问题:计数、使用空表值以及外键处理。

用COUNT(*)处理空值

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

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

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

SET NOCOUNT>恰当使用空表值

SQL Server可能出现一种特殊情况:在引用父表的一个表中,因为不允许空值,所以“声明引用完整性”(DRI)可能不会得到强制。即使父表不包含空值,在子表引用了父表主键约束或惟一约束的列中,也可能包含空值。

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

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

SET NOCOUNT>以下代码则创建子表,并在引用父表的列中插入一个空值。

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 

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

如果由两个列共同组成主键,而且一个子表将主键作为可为空值的外键来继承,就可能得到错误的数据。可在一个外键列中插入有效的值,但在另一个外键列中插入空值。然后,可添加一个数据表检查约束,在可为空的外键中检查数据的有效性。

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

以下示范脚本展示了这样的一个异常,以及如何用检查约束来纠正它。

SQL Server中处理空值时涉及的三问题

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

 

责任编辑:佚名 来源: 互联网
相关推荐

2011-04-01 14:14:42

SQL Server空值

2011-03-11 14:36:56

SQL Server数

2010-06-17 15:17:24

SQL Server

2010-06-28 14:01:37

SQL Server数

2010-07-23 09:15:08

安装SQL Serve

2010-07-12 14:13:15

SQL Server开

2010-07-19 10:55:07

SQL Server

2015-04-22 12:08:16

JAVAMap问题

2009-08-25 09:29:18

维护代码

2009-12-08 14:42:30

Windows 7操作

2010-07-06 10:25:16

SQL Server空

2010-07-14 11:35:57

SQL Server修

2010-07-12 10:48:21

SQL Server数

2010-09-03 10:52:10

SQL删除

2010-06-17 16:30:23

SQL Server数

2010-07-06 17:16:43

SQL Server视

2010-07-20 11:26:08

SQL Server阻

2010-07-08 13:13:14

清除SQL Serve

2010-07-20 11:31:25

SQL Server避

2010-06-29 17:45:22

SQL Server
点赞
收藏

51CTO技术栈公众号