在sql中的默认约束上为NULL NOT NULL

时间:2013-08-28 17:24:23

标签: sql sql-server

如果我在Sql中设置一个Default约束的记录,如

[Publicbit]   BIT             DEFAULT ((0)),

我是否需要设置NULL/NOTNULL约束?

编辑:我使用布尔值,但请将您的答案扩展到其他数据类型。

5 个答案:

答案 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 :如果您要显示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
)

答案 4 :(得分:1)

这些只是可选的。如果你想指定它,由你决定

来自MSDN

  

确定列中是否允许空值。 NULL不是   严格限制但可以像NOT NULL一样指定。