在我经常处理的系统中,我经常看到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 ;
在这些情况下,如果NULL
或NOT NULL
新列,则说明不会明确说明。问题是,实际上是哪个?取决于什么?
--Change the definition of an existing column
ALTER TABLE dbo.test ALTER COLUMN SomeColumn BIGINT ;
在这种情况下,更改现有列定义(假设放大数据类型),但脚本再次无法说明可空性。列结束的是什么,null或not null?或者它会保留以前的状态吗?取决于什么?
答案 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
以保留该行为。