能否在SQL表约束中使用非持久化计算列?实现企业月度单条数据录入
问题解答
1. 实现企业每月仅一条数据(无需额外列)完全可行
你写的代码报错是因为UNIQUE约束的表达式里不能用AS定义别名,而且只提取月份会有跨年重复的问题(比如2023年1月和2024年1月会被判定为同一周期),修正后的代码应该同时包含年份和月份:
ALTER TABLE companies ADD CONSTRAINT company_one_per_month UNIQUE(company_id, date_trunc('month', size_date));
或者用extract组合年份和月份:
ALTER TABLE companies ADD CONSTRAINT company_one_per_month UNIQUE(company_id, extract(year from size_date), extract(month from size_date));
这两种写法都不需要新增表列,直接通过表达式约束实现需求。
2. 无需持久化计算列即可在约束中使用计算列
PostgreSQL允许在唯一约束、检查约束中直接使用不可变(immutable)的SQL表达式,不需要提前将计算列持久化到表中。只要你的表达式不会随时间或其他非输入因素改变(比如上面的date_trunc、extract操作日期的函数都是immutable的),就可以直接写在约束里。
内容的提问来源于stack exchange,提问作者Yehuda Stone
相关产品推荐
相关产品推荐

