SQL Server修改列数据类型时设置列默认值的方法
问题原因
你写的带DEFAULT NULL的列修改语句无法生效,核心是SQL Server的T-SQL语法设计限制:
ALTER COLUMN子句的合法语法范围仅支持修改列的数据类型、排序规则、是否允许NULL值、稀疏列/计算列属性,不支持在修改列类型时直接内联定义DEFAULT约束。DEFAULT在SQL Server中是独立的表级约束对象,必须通过专门的ADD CONSTRAINT子句创建,不能写在ALTER COLUMN的定义段里,语法解析器会直接判定这类写法无效。- 额外说明:如果列没有被显式标记为
NOT NULL,SQL Server默认允许列存储NULL值,此时DEFAULT NULL属于冗余定义——允许空值的列在插入时如果未指定该列的值,默认就会填入NULL,不需要专门绑定默认值约束。实际业务中如果你的列本身允许空值,完全不需要额外添加DEFAULT NULL约束,仅执行修改列类型的语句即可满足需求。
单条命令同时完成两类操作的方法
可以在同一个ALTER TABLE语句中用逗号分隔多个操作,实现单条命令同时修改列类型、添加默认值约束,不需要分两次执行SQL:
ALTER TABLE tablename ALTER COLUMN columnname DATETIME, ADD CONSTRAINT DF_tablename_columnname DEFAULT NULL FOR columnname;
上述语句是SQL Server支持的合法语法,单次执行即可完成你要的两个操作。
和Sybase语法的差异说明
Sybase数据库中可用的MODIFY columnname DATETIME DEFAULT NULL是Sybase独有的方言语法扩展,不属于ANSI SQL标准范畴,该语法允许在修改列属性时内联定义默认值,这个特性并没有被SQL Server继承,所以不能直接在SQL Server中套用Sybase的MODIFY写法。
内容的提问来源于stack exchange,提问作者Maxxx
相关产品推荐
相关产品推荐

