?
快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

齊樂娛樂客戶端:SQL Server的空值處理策略

?

數據完備性是任何數據庫系統要包管的重點。不管系統計劃得有多好,空數據值的問題老是存在。本文探究了在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 KE齊樂娛樂客戶端Y,

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

---------------- ------------- -------------- ---------------------

1511344

恰當應用空表值

SQL Server可能呈現一種特殊環境:在引用父表的一個表中,由于不容許空值,以是“聲明引用完備性”(DRI)可能不會獲得強制??v然父表不包孕空值,在子表引用了父表主鍵約束或惟一約束的列中,也可能包孕空值。

要是來自父表的值今朝未知,就不會有任何問題。例如,父表可能是一個地址表,而子表可能包孕聯系信息。因為許多緣故原由,可能暫時不知道要傳給父表的聯系地址。這是一種基于光陰的問題,空值在此中或許是相宜的。

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

SET NOCOUNT ON

GOCREATE TABLE Parent(pkey1 INT IDENTITY NOT NULLCONSTRAINT 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

在可以為空的外鍵中反省數據的有效性

假如由兩個列合營組成主鍵,而且一個子表將主鍵作為可為空值的外鍵來承襲,就可能得履新錯的數據??稍谝粋€外鍵列中插入有效的值,但在另一個外鍵列中插入空值。然后,可添加一個數據表反省約束,在可為空的外鍵中反省數據的有效性。

任何多列外鍵都可能碰到同樣的問題。以是,你必要添加一個反省約束來檢測非常。最初,反省約束將反省構成外鍵的所有列中可能為空的值。反省約束還要反省這些列中不能為空的值。如兩個反省都經由過程,問題就辦理了。

以下示范腳本展示了這樣的一個非常,以及若何用反省約束來矯正它。

SET NOCOUNT ONGOCREATE TABLE parent (pkey1 INT IDENTITY NOT NULL, pkey2 INT

NOT NULL, col1 INT NULL,CONSTRAINT pk_parent PRIMARY KEY NONCLUSTERED ( pkey1, pkey2))GOINSERT parent (pkey2) VALUES ( 2 )INSERT parent (pkey2) VALUES ( 85 )INSERT parent (pkey2) VALUES ( 41 )INSERT parent (pkey2) VALUES ( 11 )GOSELECT * FROM parentGOCREATE TABLE child (cpkey1 INT IDENTITY NOT NULLCONSTRAINT pk_child PRIM齊樂娛樂客戶端ARY KEY NONCLUSTERED (cpkey1),pkey1 INT NULL, pkey2 INT NULL, col1 INT NULL,CONSTRAINT fk_parent_child FOREIGN KEY (pkey1, pke齊樂娛樂客戶端y2)REFERENCES parent (pkey1, pkey2))GOINSERT child (pkey1, pkey2) VALUES ( null, 85 )GOSELECT * FROM childGODELETE childGOALTER TABLE child WITH NOCHECKADD CONSTRAINT ck_fk_parent_child CHECK((pkey1 IS NOT NULL AND pkey2 IS NOT NULL) OR(pkey1 IS NULL AND pkey2 IS NULL) )GOINSERT child (pkey1, pkey2) VALUES ( null, 11 )GODROP TABLE child, parentGO

空值是所稀有據庫開拓者和治理員都要碰到的。以是,要想開拓成功的利用法度榜樣,必須知道若何處置懲罰這些值。本文和你分享了空值處置懲罰的一些技術和技巧。

免責聲明:以上內容源自網絡,版權歸原作者所有,如有侵犯您的原創版權請告知,我們將盡快刪除相關內容。

您可能還會對下面的文章感興趣:

快三平台开户