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

时间:2015-02-28 17:31:00

标签: php sql postgresql overlap

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

是否有可能在查询中执行此操作,没有触发器,没有从数据库的第一端获取所有数据在php内检查它(因为我认为这不是最好/最快的方法)。 请纠正我,我认为错了。 我找到了PgSQL重叠函数,但是我无法构建查询!如何与高级数据库事物进行更多联系?只是通过做?

1 个答案:

答案 0 :(得分:1)

使用 exclusion constraint

使用实际range types代替start / end更优雅:

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

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

更多详情:

  

如何与高级数据库事物进行更多联系?

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