SQL Server使用ONLINE=ON添加CHECK约束报错是否支持?
SQL Server 在线添加CHECK约束问题解答
核心结论
SQL Server 不支持使用WITH (ONLINE = ON)语法在线添加CHECK约束,出现该报错属于正常的语法限制。
原因说明
ONLINE = ON是SQL Server为降低DDL操作对业务影响提供的特性,目前仅支持以下ALTER TABLE相关操作:- 联机添加、删除、重建非聚集索引
- 联机重建聚集索引
- 联机添加带默认值的列(SQL Server 2012及更高版本支持)
- 联机删除列
- CHECK约束属于表级数据校验规则,添加时默认需要全表扫描验证所有存量数据是否符合规则,SQL Server未对这类约束添加操作提供在线支持,因此直接使用
ONLINE = ON会抛出语法错误。
低影响替代操作方案
如果需要尽可能缩短DDL操作的锁表时间,减少对业务的影响,可以按两步执行:
- 先添加不校验存量数据的约束,该操作仅申请短暂的架构修改锁,执行速度极快:
ALTER TABLE abc.sample_table WITH NOCHECK ADD CONSTRAINT [some_constraint] CHECK ([column1] NOT IN (5, 9) OR ([column1] IN (5, 9) AND [column2] != 0))
- 在业务低峰期分批校验存量数据,确认所有数据符合规则后,开启约束对存量数据的校验即可:
ALTER TABLE abc.sample_table CHECK CONSTRAINT [some_constraint]
内容的提问来源于stack exchange,提问作者Dine
相关产品推荐
相关产品推荐

