如果我在Sql中设置一个Default
约束的记录,如
[Publicbit] BIT DEFAULT ((0)),
我是否需要设置NULL/NOTNULL
约束?
编辑:我使用布尔值,但请将您的答案扩展到其他数据类型。
答案 0 :(得分:3)
你从不需要 Null约束,但是默认值不会保护你的表免受显式NULL的影响。因此,如果要强制执行此条件,则应使用NOT NULL约束。
use tempdb
go
CREATE TABLE example
(
id BIT DEFAULT (0)
)
INSERT example (id) VALUES (null)
SELECT * FROM example
答案 1 :(得分:2)
不,它们是可选的。
column_name ... [ NULL | NOT NULL ]
当您的选项为NULL
时,您不应期望0/1
。
答案 2 :(得分:2)
您应该指定NOT NULL,以防止NULL进入此记录。这听起来像你想要的唯一有效值是0和1.如果某人(或将来你)写了一个传入该列的NULL的记录(或代码),那么除非你指定NOT NULL,否则它将被允许。 / p>
通过指定DEFAULT,如果SQL INSERT语句不包含该列,则只能防止NULL值。
答案 3 :(得分:2)
具有DEFAULT值的列可以是必需的(NOT NULL),也可以允许空值(NULL)。 在我看来,从查询编写的角度来看,最好有强制列,因为允许空值的列会导致不必要的复杂性:
示例#1 :在某些情况下,如果要显示所有非活动行,则可以编写
WHERE Publicbit = 0
但如果此列允许空值,则可以使用
WHERE Publicbit = 0 OR Publicbit IS NULL
示例#2 :如果您要显示MyColum1
和MyColum2
具有不同值的行,那么您可以使用
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
)
答案 4 :(得分:1)