Postgres约束唯一的日期时间范围

时间:2014-11-04 13:09:06

标签: sql postgresql database-design constraints mutual-exclusion

我的表有两列:

  1. startsAt
  2. endsAt
  3. 两者都保存日期和时间。 我想做出以下约束:

    如果两列都不为NULL,则startsAt和endsAt之间的范围不得与其他范围(来自其他行)重叠。

1 个答案:

答案 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)会自动采用默认界限:包括较低和排除较高的'[)',这通常是最好的。

SQL Fiddle.

相关:

向现有表格添加约束

ALTER TABLE tbl ADD CONSTRAINT tbl_no_overlapping_time_ranges
EXCLUDE USING gist (tsrange(starts_at, ends_at) WITH &&)

语法详细信息与CREATE TABLE相同。