首页 > 解决方案 > 我可以在 SQL Server 中在线删除非空约束吗?

问题描述

我有一个包含很多行的表(超过 300 000 000)。我想通过在数据库仍处于负载状态时运行下一个 SQL 查询来删除其中一列的非空约束(由于表很大,可能需要大约 10 分钟):

ALTER TABLE DECLARATION
    ALTER COLUMN LOCAL_REFERENCE_NUMBER VARCHAR(22) NULL WITH (ONLINE = ON);

我希望这个ONLINE = ON选项能够确保在更新期间表没有被锁定,以确保使用数据库的应用程序在更新期间仍然可以执行此操作。

但是,文档说这ONLINE = ON仅适用于添加和删除索引以及主键或唯一约束,即,从官方文档看来,此选项对非空约束无效。

确实是这样,还是文档不完整?如果是这种情况,那么删除 not null 约束以致不能在线完成有什么特别之处?

谢谢你。

标签: sql-serverdatabase

解决方案


如评论部分所述,此操作应仅为元数据操作(如果未发生数据类型更改):

ALTER TABLE DECLARATION
    ALTER COLUMN LOCAL_REFERENCE_NUMBER VARCHAR(22) NULL;

可以通过设置扩展事件会话和观察 sqlserver.compressed_alter_column_is_md_only事件来验证(SQL Server 2016+)


推荐阅读