我想阻止插入我的PgSQL表中,如果一段时间的值(让我们称之为newStart和newEnd),如果这会与我的行中的任何其他时间段重叠。 因此,该表有一堆行,每行都有一个开始和结束日期(oldStart和oldEnd)。
是否有可能在查询中执行此操作,没有触发器,没有从数据库的第一端获取所有数据在php内检查它(因为我认为这不是最好/最快的方法)。 请纠正我,我认为错了。 我找到了PgSQL重叠函数,但是我无法构建查询!如何与高级数据库事物进行更多联系?只是通过做?
答案 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
);
更多详情:
如何与高级数据库事物进行更多联系?
在这里学习答案,阅读优秀的手册,尝试新发现的技术。