PostgreSQL如何同时修改列的默认值并设置NOT NULL非空约束?
问题原因说明
ADD COLUMN和ALTER COLUMN的语法规则完全不同:
- 新增列时
ADD COLUMN支持在同一段声明里依次指定数据类型、默认值、约束等多个属性,所以你看到的示例可以正常运行 - 修改已有列属性时,单条
ALTER COLUMN子句仅支持执行一种修改操作,你直接将默认值设置和非空约束拼接在同一句里,不符合语法规范,因此触发报错。
别人提供的SET DEFAULT false IS NOT NULL写法实际是将列的默认值设置为了表达式false IS NOT NULL的运算结果(值为true),完全不符合你要设置默认值为false的需求,不要使用。
正确实现方式
你不需要拆分执行多条ALTER TABLE语句,在同一条语句里声明两个ALTER COLUMN子句即可同时完成两项修改:
ALTER TABLE signedcodeofconduct ALTER COLUMN affirmed SET DEFAULT false, ALTER COLUMN affirmed SET NOT NULL;
注意:如果当前
affirmed列已经存在NULL值,执行上述语句会触发非空约束报错,需要先执行更新语句将所有NULL值修正为合法非空值后再执行约束设置。
内容的提问来源于stack exchange,提问作者Jürgen Gmach
相关产品推荐
相关产品推荐

