sql server 關(guān)于設(shè)置null的一些建議
我們設(shè)計表時,在字段是否允許Null值這個問題上,有時會爭論一番。
數(shù)據(jù)庫牛人Kalen Delaney則給了一下建議:
1,永遠不要在用戶表中允許NULL值
2,在用戶表定義中包含一個NOT NULL限制
3,不要依賴數(shù)據(jù)庫屬性來控制NULL值的行為
對于第一點,我們反向說,如果允許NULL,會給我們帶來什么影響。
1,SQL 在每條記錄中都設(shè)置了一個特殊的bitmap來顯示哪些允許空值的列上存儲的真的是空值。如果是NULL,在訪問每一行的時候SQL Server都必須對這個bitmap進行解碼。
2,允許NULL還增加了應用程序代碼的復雜度,總的添加一些特殊的邏輯來處理這個NULL值,這常常會導致bug。
第二點,在包含不允許NULL的列上,要加入一些默認值,如果不允許NULL,但是還沒有加默認值,在沒有顯示列插入的話,就會造成INSERT的失敗,SQL Server默認在INSERT中,對沒有顯示的列做NULL插入。
最后一點,主要涉及到于NULL值的比較。在我們印象中,是用IS NULL,IS NOT NULL比較呢,還是用=,<>比較呢。這取決于數(shù)據(jù)庫選項ANSI NULLS,我們不可能更改數(shù)據(jù)庫選項(我們大部分不是DBA),但是我們可以使用會話設(shè)置SET ANSI_NULLS相當于數(shù)據(jù)庫選項ANSI NULLS。當這個選項為真是,所有與空值的比較都將得出FALSE,代碼必須使用IS NULL條件來判斷是否為空,而當這個選項為假時,如果進行比較的兩個值都是空值將得出TRUE,SQL Server允許將 =NULL作為IS NULL的同義詞,將<> NULL 作為IS NOT NULL的同義詞。
如果忘記這個選項,建議用IS NULL判斷空,IS NOT NULL判斷非空。
測試如下:
在t3表中只有兩行數(shù)據(jù),如圖:
SET ANSI_NULLS OFF 時:
SET ANSI_NULLS ON 時
總結(jié)下來,最優(yōu)的辦法是:在設(shè)計表的時候,不要允許字段為NULL,并為字段附上默認值。
- sqlserver2005 安裝圖解教程以及SQL 2005 SP3補丁安裝圖文教程
- MySQL server has gone away 問題的解決方法
- sqlserver中distinct的用法(不重復的記錄)
- SQL Server 2008 安裝和配置圖解教程(附官方下載地址)
- SQL Server 2008 阻止保存要求重新創(chuàng)建表的更改問題的設(shè)置方法
- SQL Server數(shù)據(jù)庫入門學習總結(jié)
- SQL Server 2012 安裝圖解教程(附sql2012下載地址)
- Sql Server 2008完全卸載方法(其他版本類似)
- SQL Server 在Management Studio中使用Web瀏覽器
相關(guān)文章
sql server2005實現(xiàn)數(shù)據(jù)庫讀寫分離介紹
對于負載均衡,筆者經(jīng)常接觸的當屬Oracle的負載均衡機制。下面我們重點介紹Sql Server 2005是如何實現(xiàn)負載均衡的,感興趣的朋友可以參考下哈2013-06-06SQL Server 2005 定時執(zhí)行SQL語句的方法
這篇文章主要介紹了SQL Server 2005 定時執(zhí)行SQL語句的方法,需要的朋友可以參考下2015-07-07sql里將重復行數(shù)據(jù)合并為一行數(shù)據(jù)使用逗號進行分隔
sql里將重復行數(shù)據(jù)合并為一行,將多行fieldname字段的內(nèi)容串聯(lián)起來,用逗號分隔,接下來為大家介紹下詳細的實現(xiàn)sql語句,希望對你有所幫助2013-04-04Sql Server 2005的1433端口打開局域網(wǎng)訪問和進行遠程連接
在實際項目中,我們經(jīng)常會遇到需要局域網(wǎng)訪問或者需要外網(wǎng)訪問甚至是兩者都需要的數(shù)據(jù)庫搭建,那么應該如何來處理呢,我們來一一探討下2014-08-08