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

问题描述 投票:6回答:1

我的表有两列:

  1. startsAt
  2. endsAt

两者都保持日期和时间。我想制定以下约束:

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

sql postgresql database-design constraints mutual-exclusion
1个回答
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.

有关:

Add constraint to existing table

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

语法细节与CREATE TABLE相同。

© www.soinside.com 2019 - 2024. All rights reserved.