我的表有两列:
startsAt
endsAt
两者都保存日期和时间。 我想做出以下约束:
如果两列都不为NULL,则startsAt和endsAt之间的范围不得与其他范围(来自其他行)重叠。
答案 0 :(得分:13)
您可以保留单独的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
相同。