当 DDL 未显式设置列时,列具有什么“可空性”?

问题描述 投票:0回答:1

经常有数据库架构更改脚本创建或修改列,但不声明列是否可为空。有问题的具体案例是这样的:

--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
?它会保留之前的状态吗?取决于什么?

sql-server
1个回答
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
以保留该行为。

© www.soinside.com 2019 - 2024. All rights reserved.