经常有数据库架构更改脚本创建或修改列,但不声明列是否可为空。有问题的具体案例是这样的:
--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 ;
--Change the definition of an existing column
ALTER TABLE dbo.test ALTER COLUMN SomeColumn BIGINT ;
在这种情况下,语句不会明确说明该列是
NULL
还是 NOT NULL
。问题是,在每种情况下默认应用什么 NULL 选项(新表、使用新列更改现有表以及更改现有列更改现有列。)
特别令人感兴趣的是已更改的现有列定义(假设扩大数据类型),但脚本未指定可为空性;最终状态是什么,
NULL
还是NOT NULL
?它会保留之前的状态吗?取决于什么?
在
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
以保留该行为。