簡體   English   中英

在sql中的默認約束上為NULL NOT NULL

[英]NULL NOT NULL on Default constraint in sql

如果我在Sql中設置一個帶有Default約束的記錄,例如

[Publicbit]   BIT             DEFAULT ((0)),

我需要設置NULL/NOTNULL約束嗎?

編輯:我使用布爾值,但請擴展您對其他數據類型的答案。

您永遠不需要 Null約束,但默認值不會保護您的表免受顯式NULL的影響。 因此,如果要強制執行此條件,則應使用NOT NULL約束。

use tempdb
go
CREATE TABLE example
(
    id BIT DEFAULT (0)
)

INSERT example (id) VALUES (null)

SELECT * FROM example

不,他們是可選的。

column_name 
    ...
    [ NULL | NOT NULL ]

當您的選項為0/1時,您不應期望NULL

您應該指定NOT NULL,以防止NULL進入此記錄。 這聽起來像你想要的唯一有效值是0和1.如果某人(或將來你)寫了一個傳入此列的NULL的記錄(或代碼),那么除非你指定NOT NULL,否則它將被允許。

通過指定DEFAULT,如果SQL INSERT語句不包含該列,則僅保護NULL值。

具有DEFAULT值的列可以是必需的(NOT NULL),也可以允許空值(NULL)。 在我看來,從查詢編寫的角度來看,最好有強制列,因為允許空值的列可能會導致不必要的復雜性

示例#1 :在某些情況下,如果要顯示可以寫入的所有非活動行

WHERE Publicbit = 0

但如果此列允許空值,那么您可以使用

WHERE Publicbit = 0 OR Publicbit IS NULL

示例#2 :如果要顯示MyColum1MyColum2具有不同值的那些行,那么您可以使用

WHERE MyColumn1 <> MyColumn2

但如果這些列允許空值,那么你必須重寫

WHERE MyColumn1 <> MyColumn2
OR MyColumn1 IS NULL AND MyColumn2 IS NOT NULL
OR MyColumn1 IS NOT NULL AND MyColumn2 IS NULL

要么

WHERE MyColumn1 <> MyColumn2
OR EXISTS
(
    SELECT MyColumn1 
    EXCEPT
    SELECT MyColumn2
)

這些只是可選的。 如果您想要指定它,由您決定

來自MSDN

確定列中是否允許空值。 NULL不是嚴格的約束,但可以像NOT NULL一樣指定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM