PostgreSQL如何限制INTERVAL类型仅支持存储年、月、日字段?
PostgreSQL限制INTERVAL字段仅存储年/月/日的解决方案
PostgreSQL原生INTERVAL的字段范围限定语法不支持直接配置YEAR TO DAY这类覆盖年、月、日三个维度的规则,可通过以下两种方案实现需求:
- 方案1:使用CHECK约束直接校验字段值
最轻量化的实现方式,在建表时直接添加校验规则,拦截所有带时、分、秒的INTERVAL值插入:
若表已存在,可单独新增约束:CREATE TABLE test_interval ( col1 INTERVAL CHECK ( EXTRACT(HOUR FROM col1) = 0 AND EXTRACT(MINUTE FROM col1) = 0 AND EXTRACT(SECOND FROM col1) = 0 ) );ALTER TABLE test_interval ADD CONSTRAINT check_interval_no_time CHECK ( EXTRACT(HOUR FROM col1) = 0 AND EXTRACT(MINUTE FROM col1) = 0 AND EXTRACT(SECOND FROM col1) = 0 ); - 方案2:自定义DOMAIN类型(适合多表复用场景)
如果有多个表都需要用到仅含年/月/日的INTERVAL类型,可以提前自定义域类型,后续建表直接引用即可,无需重复写校验规则:-- 自定义域类型 CREATE DOMAIN interval_ymd AS INTERVAL CHECK ( EXTRACT(HOUR FROM VALUE) = 0 AND EXTRACT(MINUTE FROM VALUE) = 0 AND EXTRACT(SECOND FROM VALUE) = 0 ); -- 建表时直接使用自定义类型 CREATE TABLE test_interval ( col1 interval_ymd );
两种方案都可以和你应用侧使用的java.time.Period完美适配,Period本身仅包含年、月、日三个属性,转换为PostgreSQL INTERVAL时不会携带时/分/秒部分,不会触发规则拦截。
内容的提问来源于stack exchange,提问作者RomanMitasov
相关产品推荐
相关产品推荐

