程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> SqlServer2005 >> sql server 關於設置null的一些建議

sql server 關於設置null的一些建議

編輯:SqlServer2005

我們設計表時,在字段是否允許Null值這個問題上,有時會爭論一番。

數據庫牛人Kalen Delaney則給了一下建議:

1,永遠不要在用戶表中允許NULL值
2,在用戶表定義中包含一個NOT NULL限制
3,不要依賴數據庫屬性來控制NULL值的行為

對於第一點,我們反向說,如果允許NULL,會給我們帶來什麼影響。

1,SQL 在每條記錄中都設置了一個特殊的bitmap來顯示哪些允許空值的列上存儲的真的是空值。如果是NULL,在訪問每一行的時候SQL Server都必須對這個bitmap進行解碼。
2,允許NULL還增加了應用程序代碼的復雜度,總的添加一些特殊的邏輯來處理這個NULL值,這常常會導致bug。

第二點,在包含不允許NULL的列上,要加入一些默認值,如果不允許NULL,但是還沒有加默認值,在沒有顯示列插入的話,就會造成INSERT的失敗,SQL Server默認在INSERT中,對沒有顯示的列做NULL插入。

最後一點,主要涉及到於NULL值的比較。在我們印象中,是用IS NULL,IS NOT NULL比較呢,還是用=,<>比較呢。這取決於數據庫選項ANSI NULLS,我們不可能更改數據庫選項(我們大部分不是DBA),但是我們可以使用會話設置SET ANSI_NULLS相當於數據庫選項ANSI NULLS。當這個選項為真是,所有與空值的比較都將得出FALSE,代碼必須使用IS NULL條件來判斷是否為空,而當這個選項為假時,如果進行比較的兩個值都是空值將得出TRUE,SQL Server允許將 =NULL作為IS NULL的同義詞,將<> NULL 作為IS NOT NULL的同義詞。

如果忘記這個選項,建議用IS NULL判斷空,IS NOT NULL判斷非空。

測試如下:

在t3表中只有兩行數據,如圖:

https://www.aspphp.online/shujuku/UploadFiles_3118/201701/2017011117125375.png

SET ANSI_NULLS OFF 時:

https://www.aspphp.online/shujuku/UploadFiles_3118/201701/2017011117125382.png

SET ANSI_NULLS ON 時

https://www.aspphp.online/shujuku/UploadFiles_3118/201701/2017011117125371.png

總結下來,最優的辦法是:在設計表的時候,不要允許字段為NULL,並為字段附上默認值

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved