当DDL没有明确设置列时,可空性是什么?

时间:2015-10-17 22:58:11

标签: sql-server

在我经常处理的系统中,我经常看到DB模式更改脚本,在创建或修改列时,如果列可以为空,则不会说明(我知道它是明确的良好做法,但是不是每个人都遵循那个)。我想知道的具体案例是:

--Create a new table or add a new column to an existing table
CREATE TABLE dbo.test (SomeColumn INT) ;
ALTER TABLE dbo.test ADD SomeColumn INT ;

在这些情况下,如果NULLNOT NULL新列,则说明不会明确说明。问题是,实际上是哪个?取决于什么?

--Change the definition of an existing column
ALTER TABLE dbo.test ALTER COLUMN SomeColumn BIGINT ;

在这种情况下,更改现有列定义(假设放大数据类型),但脚本再次无法说明可空性。列结束的是什么,null或not null?或者它会保留以前的状态吗?取决于什么?

1 个答案:

答案 0 :(得分:4)

create table取决于。

大多数客户将SET ANSI_NULL_DFLT_ON ON这意味着列将以NULL结尾(PK中的列除NOT NULL始终是默认值)。

但有可能SET ANSI_NULL_DFLT_OFF ON在这种情况下,他们将NOT NULL

如果两者都是OFF,则它会回退到is_ansi_null_default_on数据库选项。

最好明确。

alter table中,除非另有说明,否则它始终表现为ansi默认值已启用且列将最终允许null。在更改现有列时,不会考虑其现有状态,因此必须明确指定not null以保留该行为。