我的表有两列:
> startsAt
>结束
两者都保持日期和时间.
我想制定以下约束:
如果两列都不是NULL,则startsAt和endsAt之间的范围不得与其他范围(来自其他行)重叠.
解决方法
您可以保留单独的时间戳列,并在表达式上仍然使用
exclusion constraint:
CREATE TABLE tbl ( tbl_id serial PRIMARY KEY,starts_at timestamp,ends_at timestamp,EXCLUDE USING gist (tsrange(starts_at,ends_at) WITH &&) -- no overlapping );
Constructing a tsrange
value没有显式边界,因为tsrange(starts_at,ends_at)自动采用默认边界:包括下限和排除上限 – ‘[)’,这通常是最好的.
有关:
> Preventing adjacent/overlapping entries with EXCLUDE in PostgreSQL
向现有表添加约束
ALTER TABLE tbl ADD CONSTRAINT tbl_no_overlapping_time_ranges EXCLUDE USING gist (tsrange(starts_at,ends_at) WITH &&)
语法详细信息与CREATE TABLE
相同.