成人在线你懂的-成人在线免费小视频-成人在线免费网站-成人在线免费视频观看-日韩精品国产一区二区-日韩精品国产一区

掃一掃
關注微信公眾號

在SQL Server中處理空值時涉及的三個問題
2007-10-31   賽迪網

這篇文章主要介紹了在SQL Server中處理空值時所涉及的3個問題:計數、使用空表值以及外鍵處理。

用COUNT(*)處理空值

大多數集合函數都能在計算時消除空值;COUNT函數則屬于例外。對包含空值的一個列使用COUNT函數,空值會從計算中消除。但假如COUNT函數使用一個星號,它就計算所有行,而不管是否存在空值。

如果希望COUNT函數對給定列的所有行(包括空值)進行計數,請使用ISNULL函數。ISNULL函數會將空值替換成有效的值。

事實上,對集合函數來說,如果空值可能導致錯誤結果,ISNULL函數就非常有用。記住在使用一個星號時,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
 ---------------- ------------- -------------- ------------  

15             11                3           4         4

恰當使用空表值

SQL Server可能出現一種特殊情況:在引用父表的一個表中,因為不允許空值,所以“聲明引用完整性”(DRI)可能不會得到強制。即使父表不包含空值,在子表引用了父表主鍵約束或惟一約束的列中,也可能包含空值。

假如來自父表的值目前未知,就不會有任何問題。例如,父表可能是一個地址表,而子表可能包含聯系信息。由于許多原因,可能暫時不知道要傳給父表的聯系地址。這是一種基于時間的問題,空值在其中或許是合適的。

如下例所示,我們創建父表,并在其中插入兩個值。

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

以下代碼則創建子表,并在引用父表的列中插入一個空值。

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

但在以下代碼中,要同時從父表和子表選擇值。雖然父表不包含空值,但在子表引用了父表的那個列中,將允許一個空值。

然后丟棄所有表,清除這個演示所用的數據庫對象。

SELECT * FROM ChildGOSELECT * FROM ParentGODROP TABLE Child, ParentGO

在可以為空的外鍵中檢查數據的有效性

如果由兩個列共同組成主鍵,而且一個子表將主鍵作為可為空值的外鍵來繼承,就可能得到錯誤的數據??稍谝粋€外鍵列中插入有效的值,但在另一個外鍵列中插入空值。然后,可添加一個數據表檢查約束,在可為空的外鍵中檢查數據的有效性。

任何多列外鍵都可能遇到同樣的問題。所以,你需要添加一個檢查約束來檢測異常。最初,檢查約束將檢查構成外鍵的所有列中可能為空的值。檢查約束還要檢查這些列中不能為空的值。如兩個檢查都通過,問題就解決了。

以下示范腳本展示了這樣的一個異常,以及如何用檢查約束來糾正它。

熱詞搜索:

上一篇:關于 vista-用QQ
下一篇:輕松掌握 DB2中應當如何進行數據移動

分享到: 收藏
主站蜘蛛池模板: 饥渴少妇av| 九龙城寨在线观看| 低糖食物一览表| 宇宙护卫队电影| 李路导演的电视剧有哪些| 13位的电话号码是什么电话 | 无耻之徒阿曼达| 母亲电影完整版韩国| 忘忧草电影| 四年级下册古诗三首| 胡金铨最好的十部电影| 王琳琳个人资料及简历| 在灿烂阳光下歌谱完整| 轮回乐队| 白鹿电影| 真爱诺言大结局| 江南好简谱| 最新好看电影| 大地资源中文字幕第3页| 天地姻缘七仙女演员表| 乔治爸爸去哪儿| 寡妇一级毛片免费看| 以家人之名小说原著| 寻梦环游记英文| 少爷和我短剧| 春意视频| 都市频道在线直播观看| 敬天法祖| 十大黄色软件推荐免费| 百分百感觉| 送教上门工作情况记录表| 护航 电影| 践行者| 以下关于宏病毒说法正确的是| 日本大片网址| 美丽交易| 幼儿园课题研究| 1980属猴多少岁了| 珠江电视台直播 珠江频道| 电影《遗产》韩国丧尸| 非常外父|