|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
虽然可以将一个droptable语句转换成先delete再删表,性能却会降低很多。这里我们用上面说道的另外一种可用数据:“操作前数据备份”。server|战略数据完全性是任何数据库体系要包管的重点。不论体系企图得有多好,空数据值的成绩老是存在。本文切磋了在SQLServer中处置这些值时触及的3个成绩:计数、利用空表值和外键处置。用COUNT(*)处置空值
<P>年夜多半汇合函数都能在盘算时打消空值;COUNT函数则属于破例。对包括空值的一个列利用COUNT函数,空值会从盘算中打消。但假设COUNT函数利用一个星号,它就盘算一切行,而不论是否存在空值。
假如但愿COUNT函数对给定列的一切行(包含空值)举行计数,请利用ISNULL函数。ISNULL函数会将空值交换成无效的值。
<P>现实上,对汇合函数来讲,假如空值大概招致毛病了局,ISNULL函数就十分有效。记着在利用一个星号时,COUNT函数会对一切行举行盘算。下例演示了空值在AVG和COUNT汇合函数中的影响:- SETNOCOUNTON
- GO
- CREATETABLExCount
- (pkey1INTIDENTITYNOTNULL
- CONSTRAINTpk_xCountPRIMARYKEY,
- Col1intNULL)
- GO
- INSERTxCount(Col1)VALUES(10)
- GO
- INSERTxCount(Col1)VALUES(15)
- GO
- INSERTxCount(Col1)VALUES(20)
- GO
- INSERTxCount(Col1)VALUES(NULL)
- GO
- SELECTAVG(Col1)AvgWithoutIsNullFunctionOnCol1,
- AVG(ISNULL(Col1,0))AvgWithIsNullFunctionOnCol1,
- COUNT(Col1)NoIsNullFunctionOnCol1,
- COUNT(ISNULL(Col1,0))UsingIsNullFunctionOnCol1,
- Count(*)UsingAsterisk
- FROMxCount
- GO
- DROPTABLExCount
- GO
- OUTPUT:
- AvgWOIsNullFnctnCol1AvgWIsNullFnctnCol1WOIsNullFnctnCol1
- WIsNullFnctnCol1UsingAsterisk
- ----------------------------------------------------------------
- 1511344
复制代码 得当利用空表值
SQLServer大概呈现一种特别情形:在援用父表的一个表中,由于不同意空值,以是“声明援用完全性”(DRI)大概不会失掉强迫。即便父表不包括空值,在子表援用了父表主键束缚或唯一束缚的列中,也大概包括空值。
假设来自父表的值今朝未知,就不会有任何成绩。比方,父表多是一个地点表,而子表大概包括接洽信息。因为很多缘故原由,大概临时不晓得要传给父表的接洽地点。这是一种基于工夫的成绩,空值在个中也许是符合的。
以下例所示,我们创立父表,并在个中拔出两个值。
SETNOCOUNTON
GOCREATETABLEParent(pkey1INTIDENTITYNOTNULLCONSTRAINTpkParentPRIMARYKEY,col1INTNULL)GOINSERTParent(col1)VALUES(284)GOINSERTParent(col1)VALUES(326)GO
以下代码则创立子表,并在援用父表的列中拔出一个空值。
CREATETABLEChild
(pkey1INTIDENTITYCONSTRAINTpkChildPRIMARYKEY,Parentpkey1INTNULLCONSTRAINTfkChildParentFOREIGNKEYREFERENCESParent(pkey1),col1INTNULL)GOINSERTChild(Parentpkey1,col1)VALUES(null,2)GO
但在以下代码中,要同时从父表和子表选择值。固然父表不包括空值,但在子表援用了父表的谁人列中,将同意一个空值。
然后抛弃一切表,扫除这个演示所用的数据库工具。
SELECT*FROMChildGOSELECT*FROMParentGODROPTABLEChild,ParentGO
在能够为空的外键中反省数据的无效性
假如由两个列配合构成主键,并且一个子表将主键作为可为空值的外键来承继,便可能失掉毛病的数据。可在一个外键列中拔出无效的值,但在另外一个外键列中拔出空值。然后,可增加一个数据表反省束缚,在可为空的外键中反省数据的无效性。
任何多列外键都大概碰到一样的成绩。以是,你必要增加一个反省束缚来检测非常。最后,反省束缚将反省组成外键的一切列中大概为空的值。反省束缚还要反省这些列中不克不及为空的值。如两个反省都经由过程,成绩就办理了。
以下树模剧本展现了如许的一个非常,和怎样用反省束缚来改正它。
SETNOCOUNTONGOCREATETABLEparent(pkey1INTIDENTITYNOTNULL,pkey2INT
NOTNULL,col1INTNULL,CONSTRAINTpk_parentPRIMARYKEYNONCLUSTERED(pkey1,pkey2))GOINSERTparent(pkey2)VALUES(2)INSERTparent(pkey2)VALUES(85)INSERTparent(pkey2)VALUES(41)INSERTparent(pkey2)VALUES(11)GOSELECT*FROMparentGOCREATETABLEchild(cpkey1INTIDENTITYNOTNULLCONSTRAINTpk_childPRIMARYKEYNONCLUSTERED(cpkey1),pkey1INTNULL,pkey2INTNULL,col1INTNULL,CONSTRAINTfk_parent_childFOREIGNKEY(pkey1,pkey2)REFERENCESparent(pkey1,pkey2))GOINSERTchild(pkey1,pkey2)VALUES(null,85)GOSELECT*FROMchildGODELETEchildGOALTERTABLEchildWITHNOCHECKADDCONSTRAINTck_fk_parent_childCHECK((pkey1ISNOTNULLANDpkey2ISNOTNULL)OR(pkey1ISNULLANDpkey2ISNULL))GOINSERTchild(pkey1,pkey2)VALUES(null,11)GODROPTABLEchild,parentGO
空值是一切数据库开辟者和办理员都要碰到的。以是,要想开辟乐成的使用程序,必需晓得怎样处置这些值。本文和你分享了空值处置的一些技能和手艺。
为多种编程语言提供了API。这些编程语言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等。 |
|