莫相离 发表于 2015-1-16 22:26:12

MSSQL网页设计SQL Server的空值处置战略

虽然可以将一个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等。

灵魂腐蚀 发表于 2015-1-19 12:06:48

而SQLServer如果能像Oracle一样可以为登陆分配如:5%的cpu,10%的内存。就可以解决这个漏洞。

深爱那片海 发表于 2015-1-28 06:54:17

但是随着数据量的增大,这种成本差距会逐渐减小,趋于相等。(500万数量级只相差10%左右)

老尸 发表于 2015-2-5 19:31:02

你可以简单地认为适合的就是好,不适合就是不好。

活着的死人 发表于 2015-3-3 19:41:40

这一点很好的加强了profiler的功能。但是提到profiler提醒大家注意一点。windows2003要安装sp1补丁才能启动profiler。否则点击没有反应。

愤怒的大鸟 发表于 2015-3-11 13:12:27

学习SQL语言的话如果要学会去做网站就不是很难!但是要做数据库管理的话就有难度了!

柔情似水 发表于 2015-3-18 20:39:35

对递归类的树遍历很有帮助。个人感觉这个真是太棒了!阅读清晰,非常有时代感。

乐观 发表于 2015-3-26 15:54:11

多走走一此相关论坛,多看一些实例开发,多交流0经验,没什么的,我也是刚学没多久!加油
页: [1]
查看完整版本: MSSQL网页设计SQL Server的空值处置战略