You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 07:20:35