PostgreSQL中已存在列添加NOT NULL约束与默认值的方法
问题描述
先执行了以下SQL添加列:
ALTER TABLE sys.system_property ADD COLUMN IF NOT EXISTS description text; COMMENT ON COLUMN sys.system_property.description IS 'description of property';
之后想要给该列设置默认值并添加NOT NULL约束,执行了以下语句:
ALTER TABLE sys.system_property ADD COLUMN IF NOT EXISTS description text NOT NULL DEFAULT 'Missing Description'; COMMENT ON COLUMN sys.system_property.description IS 'description of property';
但由于列已存在,语句被跳过,报错信息如下:
ALTER TABLE sys.system_property ADD COLUMN IF NOT EXISTS description text NOT NULL DEFAULT 'Missing Description' [2022-11-04 12:02:22] [42701] column "description" of relation "system_property" already exists, skipping
需要修改该列以添加所需约束和默认值。
解决方案
目标列已存在,不能再使用ADD COLUMN语句,需改用ALTER COLUMN修改列属性,操作步骤如下:
- 设置列的默认值
ALTER TABLE sys.system_property ALTER COLUMN description SET DEFAULT 'Missing Description';
- 添加
NOT NULL约束
注意:执行此步骤前,必须确保列中没有
NULL值,否则会触发报错。若存在NULL值,先执行更新语句将其替换为默认值:
UPDATE sys.system_property SET description = 'Missing Description' WHERE description IS NULL;
完成更新后,再添加约束:
ALTER TABLE sys.system_property ALTER COLUMN description SET NOT NULL;
也可以将设置默认值和添加约束合并为一条语句(前提是已处理好现有NULL值):
ALTER TABLE sys.system_property ALTER COLUMN description SET DEFAULT 'Missing Description', ALTER COLUMN description SET NOT NULL;
若需要重新确认列注释,可执行:
COMMENT ON COLUMN sys.system_property.description IS 'description of property';
内容的提问来源于stack exchange,提问作者guradio
相关产品推荐
相关产品推荐

