SQL Server數(shù)據(jù)庫中處理空值時(shí)常見問題_Mssql數(shù)據(jù)庫教程
推薦:SQL Server不存在或訪問被拒絕 Windows里的一個(gè)bugsql server 經(jīng)常會(huì)出現(xiàn)如下錯(cuò)誤: --------------------------- SQL Server 企業(yè)管理器 --------------------------- 由于如下所示的連接錯(cuò)誤,SQL Server 注冊失敗。還要注冊嗎?
數(shù)據(jù)完整性是任何數(shù)據(jù)庫系統(tǒng)要保證的重點(diǎn)。不管系統(tǒng)計(jì)劃得有多好,空數(shù)據(jù)值的問題總是存在。本文探討了在SQL Server中處理這些值時(shí)涉及的3個(gè)問題:計(jì)數(shù)、使用空表值以及外鍵處理。
用COUNT(*)處理空值
大多數(shù)集合函數(shù)都能在計(jì)算時(shí)消除空值;COUNT函數(shù)則屬于例外。對包含空值的一個(gè)列使用COUNT函數(shù),空值會(huì)從計(jì)算中消除。但假如COUNT函數(shù)使用一個(gè)星號(hào),它就計(jì)算所有行,而不管是否存在空值。
如果希望COUNT函數(shù)對給定列的所有行(包括空值)進(jìn)行計(jì)數(shù),請使用ISNULL函數(shù)。ISNULL函數(shù)會(huì)將空值替換成有效的值。
事實(shí)上,對集合函數(shù)來說,如果空值可能導(dǎo)致錯(cuò)誤結(jié)果,ISNULL函數(shù)就非常有用。記住在使用一個(gè)星號(hào)時(shí),COUNT函數(shù)會(huì)對所有行進(jìn)行計(jì)算。下例演示了空值在AVG和COUNT集合函數(shù)中的影響:
| 以下為引用的內(nèi)容: 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 ---------------- ------------- -------------- |
恰當(dāng)使用空表值
SQL Server可能出現(xiàn)一種特殊情況:在引用父表的一個(gè)表中,因?yàn)椴辉试S空值,所以“聲明引用完整性”(DRI)可能不會(huì)得到強(qiáng)制。即使父表不包含空值,在子表引用了父表主鍵約束或惟一約束的列中,也可能包含空值。
假如來自父表的值目前未知,就不會(huì)有任何問題。例如,父表可能是一個(gè)地址表,而子表可能包含聯(lián)系信息。由于許多原因,可能暫時(shí)不知道要傳給父表的聯(lián)系地址。這是一種基于時(shí)間的問題,空值在其中或許是合適的。
如下例所示,我們創(chuàng)建父表,并在其中插入兩個(gè)值。
| 以下為引用的內(nèi)容: 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 |
以下代碼則創(chuàng)建子表,并在引用父表的列中插入一個(gè)空值。
| 以下為引用的內(nèi)容: 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 |
但在以下代碼中,要同時(shí)從父表和子表選擇值。雖然父表不包含空值,但在子表引用了父表的那個(gè)列中,將允許一個(gè)空值。
然后丟棄所有表,清除這個(gè)演示所用的數(shù)據(jù)庫對象。
| 以下為引用的內(nèi)容: SELECT * FROM ChildGOSELECT * FROM ParentGODROP TABLE Child, ParentGO |
在可以為空的外鍵中檢查數(shù)據(jù)的有效性
如果由兩個(gè)列共同組成主鍵,而且一個(gè)子表將主鍵作為可為空值的外鍵來繼承,就可能得到錯(cuò)誤的數(shù)據(jù)�?稍谝粋(gè)外鍵列中插入有效的值,但在另一個(gè)外鍵列中插入空值。然后,可添加一個(gè)數(shù)據(jù)表檢查約束,在可為空的外鍵中檢查數(shù)據(jù)的有效性。
任何多列外鍵都可能遇到同樣的問題。所以,你需要添加一個(gè)檢查約束來檢測異常。最初,檢查約束將檢查構(gòu)成外鍵的所有列中可能為空的值。檢查約束還要檢查這些列中不能為空的值。如兩個(gè)檢查都通過,問題就解決了。
以下示范腳本展示了這樣的一個(gè)異常,以及如何用檢查約束來糾正它。
空值是所有數(shù)據(jù)庫開發(fā)者和管理員都要遇到的。所以,要想開發(fā)成功的應(yīng)用程序,必須知道如何處理這些值。本文和你分享了空值處理的一些技巧和技術(shù)。
分享:Sql Server中的日期與時(shí)間函數(shù)Sql Server中的日期與時(shí)間函數(shù): 1. 當(dāng)前系統(tǒng)日期、時(shí)間 select getdate() 2. dateadd 在向指定日期加上一段時(shí)間的基礎(chǔ)上,返回新的 datetime 值: 例如:
- sql 語句練習(xí)與答案
- 深入C++ string.find()函數(shù)的用法總結(jié)
- SQL Server中刪除重復(fù)數(shù)據(jù)的幾個(gè)方法
- sql刪除重復(fù)數(shù)據(jù)的詳細(xì)方法
- SQL SERVER 2000安裝教程圖文詳解
- 使用sql server management studio 2008 無法查看數(shù)據(jù)庫,提示 無法為該請求檢索數(shù)據(jù) 錯(cuò)誤916解決方法
- SQLServer日志清空語句(sql2000,sql2005,sql2008)
- Sql Server 2008完全卸載方法(其他版本類似)
- sql server 2008 不允許保存更改,您所做的更改要求刪除并重新創(chuàng)建以下表
- SQL Server 2008 清空刪除日志文件(瞬間日志變幾M)
- Win7系統(tǒng)安裝MySQL5.5.21圖解教程
- 將DataTable作為存儲(chǔ)過程參數(shù)的用法實(shí)例詳解
Mssql數(shù)據(jù)庫教程Rss訂閱編程教程搜索
Mssql數(shù)據(jù)庫教程推薦
- SQL SERVER數(shù)據(jù)庫開發(fā)之存儲(chǔ)過程應(yīng)用
- 解讀為SQL Server數(shù)據(jù)庫傳數(shù)組參數(shù)的變通辦法
- 解讀SQL Server 2005:數(shù)據(jù)類型最大值
- 如何快速確定SQL Server欄中的最大值
- 初探 SQL Server 2008 “Katmai”
- 解析SQL Server索引管理的六大鐵律
- 解讀SQL Server查詢含有單引號(hào)數(shù)據(jù)的方法
- 談SQL Server應(yīng)用程序的高級Sql注入
- 解析SQL Server數(shù)據(jù)庫恢復(fù)操作實(shí)例
- 解析SQL Server三大算法的I/O成本
猜你也喜歡看這些
- MySQL 生成隨機(jī)密碼
- MySQL——修改root密碼的4種方法(以windows為例)
- MySQL筆記之觸發(fā)器的應(yīng)用
- jdbc調(diào)用mysql存儲(chǔ)過程實(shí)現(xiàn)代碼
- 10大關(guān)系數(shù)據(jù)庫SQL注入工具一覽
- MySQL筆記之修改表的實(shí)現(xiàn)方法
- 網(wǎng)站模板:利用Shell腳本實(shí)現(xiàn)遠(yuǎn)程MySQL自動(dòng)查詢
- 基于MYSQL中優(yōu)化的一些方法
- 基于unique與primary約束的區(qū)別分析
- java連接mysql數(shù)據(jù)庫亂碼怎么辦
- 相關(guān)鏈接:
- 教程說明:
Mssql數(shù)據(jù)庫教程-SQL Server數(shù)據(jù)庫中處理空值時(shí)常見問題
。