仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1139|回复: 7
打印 上一主题 下一主题

[学习教程] MSSQL网页设计SQL Server的空值处置战略

[复制链接]
莫相离 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:26:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
虽然可以将一个droptable语句转换成先delete再删表,性能却会降低很多。这里我们用上面说道的另外一种可用数据:“操作前数据备份”。server|战略数据完全性是任何数据库体系要包管的重点。不论体系企图得有多好,空数据值的成绩老是存在。本文切磋了在SQLServer中处置这些值时触及的3个成绩:计数、利用空表值和外键处置。用COUNT(*)处置空值


<P>年夜多半汇合函数都能在盘算时打消空值;COUNT函数则属于破例。对包括空值的一个列利用COUNT函数,空值会从盘算中打消。但假设COUNT函数利用一个星号,它就盘算一切行,而不论是否存在空值。
假如但愿COUNT函数对给定列的一切行(包含空值)举行计数,请利用ISNULL函数。ISNULL函数会将空值交换成无效的值。

<P>现实上,对汇合函数来讲,假如空值大概招致毛病了局,ISNULL函数就十分有效。记着在利用一个星号时,COUNT函数会对一切行举行盘算。下例演示了空值在AVG和COUNT汇合函数中的影响:
  1. SETNOCOUNTON
  2. GO
  3. CREATETABLExCount
  4. (pkey1INTIDENTITYNOTNULL
  5. CONSTRAINTpk_xCountPRIMARYKEY,
  6. Col1intNULL)
  7. GO
  8. INSERTxCount(Col1)VALUES(10)
  9. GO
  10. INSERTxCount(Col1)VALUES(15)
  11. GO
  12. INSERTxCount(Col1)VALUES(20)
  13. GO
  14. INSERTxCount(Col1)VALUES(NULL)
  15. GO
  16. SELECTAVG(Col1)AvgWithoutIsNullFunctionOnCol1,
  17. AVG(ISNULL(Col1,0))AvgWithIsNullFunctionOnCol1,
  18. COUNT(Col1)NoIsNullFunctionOnCol1,
  19. COUNT(ISNULL(Col1,0))UsingIsNullFunctionOnCol1,
  20. Count(*)UsingAsterisk
  21. FROMxCount
  22. GO
  23. DROPTABLExCount
  24. GO
  25. OUTPUT:
  26. AvgWOIsNullFnctnCol1AvgWIsNullFnctnCol1WOIsNullFnctnCol1
  27. WIsNullFnctnCol1UsingAsterisk
  28. ----------------------------------------------------------------
  29. 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 | 只看该作者
你可以简单地认为适合的就是好,不适合就是不好。
活着的死人 该用户已被删除
5#
发表于 2015-3-3 19:41:40 | 只看该作者
这一点很好的加强了profiler的功能。但是提到profiler提醒大家注意一点。windows2003要安装sp1补丁才能启动profiler。否则点击没有反应。
愤怒的大鸟 该用户已被删除
6#
发表于 2015-3-11 13:12:27 | 只看该作者
学习SQL语言的话如果要学会去做网站就不是很难!但是要做数据库管理的话就有难度了!
柔情似水 该用户已被删除
7#
发表于 2015-3-18 20:39:35 | 只看该作者
对递归类的树遍历很有帮助。个人感觉这个真是太棒了!阅读清晰,非常有时代感。
乐观 该用户已被删除
8#
发表于 2015-3-26 15:54:11 | 只看该作者
多走走一此相关论坛,多看一些实例开发,多交流0经验,没什么的,我也是刚学没多久!加油
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-22 19:43

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表