我的表有两列:
startsAt
endsAt
两者都保持日期和时间。我想制定以下约束:
如果两列都不是NULL,则startsAt和endsAt之间的范围不得与其他范围(来自其他行)重叠。
您可以保留单独的timestamp
列,并仍然在表达式上使用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)
自动采用默认界限:包括较低和排除较高的'[)'
,这通常是最好的。
有关:
ALTER TABLE tbl ADD CONSTRAINT tbl_no_overlapping_time_ranges
EXCLUDE USING gist (tsrange(starts_at, ends_at) WITH &&)
语法细节与CREATE TABLE
相同。