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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Postgres约束唯一的日期时间范围相关的知识,希望对你有一定的参考价值。

我的表有两列:

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

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相同。

以上是关于Postgres约束唯一的日期时间范围的主要内容,如果未能解决你的问题,请参考以下文章

Postgres 唯一约束与索引

没有选择的Postgres条件唯一约束

勺子插入 postgres 会产生“重复键值违反唯一约束”

冲突部分索引的 Postgres 唯一或排除约束无法更新票证

使用一个查询递增具有唯一约束的字段中的一组值,Postgres

从 Postgres 中的非结束日期范围列表中查找未覆盖的日期范围