我的表有两列:
startsAt
endsAt
两者都保存日期和时间。 我想要设置以下约束:
如果这两列都不为空,则 startsAt 和 endsAt 之间的范围不能与其他行的范围重叠。
我的表有两列:
startsAt
endsAt
两者都保存日期和时间。 我想要设置以下约束:
如果这两列都不为空,则 startsAt 和 endsAt 之间的范围不能与其他行的范围重叠。
timestamp
列,并仍然在表达式上使用排除约束。CREATE TABLE tbl (
tbl_id serial PRIMARY KEY
, starts_at timestamp
, ends_at timestamp
, EXCLUDE USING gist (tsrange(starts_at, ends_at) WITH &&) -- no overlap
);
使用默认边界(包含下限和不包含上限的“[)”)构建一个没有显式边界的tsrange
值通常是最好的选择:Constructing a tsrange
value without explicit bounds as tsrange(starts_at, ends_at)
assumes default bounds: inclusive lower and exclusive upper - '[)'
。相关:
ALTER TABLE tbl ADD CONSTRAINT tbl_no_overlapping_time_ranges
EXCLUDE USING gist (tsrange(starts_at, ends_at) WITH &&)
语法细节与CREATE TABLE
相同。
range
列 - 我必须操作两个列:startsAt
和endsAt
。 - user606521