如何禁止PostgreSQL daterange字段插入empty值?empty与null有何区别?
问题1:禁止插入empty值的约束实现
可以通过CHECK约束实现,判断dates字段不是空范围即可。
建表时直接添加约束的示例:
CREATE TABLE public.show_instance ( id integer NOT NULL, show_id integer NOT NULL, dates daterange NOT NULL, CHECK (NOT isempty(dates)) );
已创建的表追加约束的示例:
ALTER TABLE public.show_instance ADD CONSTRAINT check_dates_not_empty CHECK (NOT isempty(dates));
补充说明:你插入的'[2010-01-01, 2010-01-01)'属于左闭右开区间,上下限相等的情况下PostgreSQL会自动将其转换为empty空范围,加了上述约束后该插入操作会直接被拦截,不会生成对应无效行。
问题2:empty范围的具体含义
empty是PostgreSQL范围类型的合法非空值,代表不包含任何元素的空范围,和null完全不同:null表示值未知、未定义,而empty是明确的、有意义的值,代表范围不存在任何有效元素,因此NOT NULL约束不会拦截empty值。- 你遇到的查询结果符合范围运算的逻辑:空集是所有集合的子集,因此
任意范围 @> empty的结果永远为真,所以你执行包含查询时empty行也会被命中;反过来你执行的<@查询是判断给定的大日期范围是否被dates字段包含,empty范围没有任何元素,不可能包含其他任何非空范围,因此返回0行,完全符合范围运算规则。
内容的提问来源于stack exchange,提问作者Trouble Bucket
相关产品推荐
相关产品推荐

