如果一个时间段的值(让我们称它们为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约束
我如何才能更多地接触高级数据库?
在这里学习答案,阅读优秀的手册,尝试新发现的技术。