PostgreSQL创建视图时如何将nullable字段强制标记为NOT NULL
解决方案
PostgreSQL不会自动基于表的CHECK约束推导视图字段的非空属性,可通过以下两种方式实现需求:
方法1:创建视图时显式标注字段非空(全版本兼容)
在查询语句中对确定非空的字段增加NOT NULL类型约束即可,写法如下:
CREATE OR REPLACE VIEW with_name as SELECT id, name::text NOT NULL FROM my_table WHERE other_property = False;
由于原表的CHECK约束已经保证other_property = False时name一定非空,这个强制类型转换不会触发运行时错误,生成的视图name字段会被标记为非空。
方法2:修改现有视图的列属性(PostgreSQL 12及以上版本支持)
如果视图已经创建完成,可以直接通过ALTER语句给指定列加非空标记:
ALTER VIEW with_name ALTER COLUMN name SET NOT NULL;
注意:执行该语句前PostgreSQL会校验视图的查询逻辑是否确实能保证该字段永远非空,校验不通过会报错,执行前请确认原表的CHECK约束已生效、且没有违反约束的历史数据。
补充说明
如果你的使用场景是为了让ORM、代码生成工具识别到字段非空,上述两种方法都可以达到预期效果,不需要调整原表的结构。
内容的提问来源于stack exchange,提问作者Ant Oleyhoo
相关产品推荐
相关产品推荐

