如果在没有触发器的PgSQL中时间重叠,则阻止INSERT


Prevent INSERT if time overlap in PgSQL without trigger

如果一个时间段的值(让我们称它们为newStart和newEnd)与我行中的任何其他时间段重叠,我希望阻止插入到我的PgSQL表中。因此,该表有一组行,每行都有一个开始和结束日期(oldStart和oldEnd)。

有没有可能在查询中做到这一点,而不需要触发器,也不需要从数据库中获取所有数据。首先在php中进行检查(因为我认为这不是最好/最快的方法)。请纠正我的错误。我找到了PgSQL重叠函数,但构建查询对我来说是不可能的!我怎样才能更多地接触到高级数据库的东西?只是通过做?

使用排除约束

使用实际范围类型而不是start/end:更优雅

  • 在PostgreSQL中使用EXCLUDE防止相邻/重叠条目

但是也可以在约束中使用表达式。基本上:

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
);

更多详细信息:

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

我如何才能更多地接触高级数据库?

在这里学习答案,阅读优秀的手册,尝试新发现的技术。