改变 SQL Server 中列的可空性

a1e*_*x07 5 sql-server constraint sql-server-2008-r2

假设我有下表:

CREATE TABLE test(test_id int not null identity primary key,
 field1 int not null,
 field2 int
);
CREATE INDEX IDX_test_field1 ON test(field1); 
CREATE INDEX IDX_test_field2 ON test(field2); 
Run Code Online (Sandbox Code Playgroud)

现在ALTER TABLE test ALTER COLUMN field1 int工作,并field1允许null.

尽管如此,我无法改变,ALTER TABLE test ALTER COLUMN field2 int not null因为

ALTER TABLE ALTER COLUMN field2 失败,因为一个或多个对象访问此列。

此外,我无法改field1not null.

但是,我可以根据需要多次添加然后删除检查约束:

ALTER TABLE test  ADD CONSTRAINT CHK_NN_field2 CHECK (field2 IS NOT NULL);   
DROP CONSTRAINT CHK_NN_field2` without any problems.
Run Code Online (Sandbox Code Playgroud)

它是定义明确的行为吗?有人可以解释为什么会发生这种情况或向我指出文档吗?

如果这很重要,我正在使用 SQL Server 2008 R2。

谢谢你。

Mar*_*ith 4

相关文档在这里

ALTER COLUMN 指定要更改或改变指定的列。

修改的列不能是以下任一列:

  • 在索引中使用时,除非列是varcharnvarchar、 或 varbinary数据类型,否则数据类型不会更改,新大小等于或大于旧大小,并且索引不是约束的结果PRIMARY KEY

  • 用于CREATE STATISTICS语句生成的统计信息,除非列是varcharnvarchar、 或varbinary数据类型,数据类型未更改,并且新大小等于或大于旧大小,或者列从 not null 更改为 null 。首先,使用语句删除统计信息DROP STATISTICS。查询优化器自动生成的统计信息将被自动删除ALTER COLUMN

然而,在实践中,SQL Server 似乎确实允许一些超出文档中提到的其他情况。

正如您在问题中所示,ALTER TABLE test ALTER COLUMN field1 int null实际上确实有效,因此对索引中使用的列的更改的限制似乎与用户创建的统计信息的限制相同。

此外,提到的有关主键的警告似乎也是不正确的。以下工作正常。

CREATE TABLE test2(pk varchar(10) primary key);

ALTER TABLE test2 ALTER COLUMN pk varchar(100) NOT NULL
Run Code Online (Sandbox Code Playgroud)