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

发布时间:2020-07-19 发布网站:脚本之家
脚本之家收集整理的这篇文章主要介绍了使用PostgreSQL中的EXCLUDE防止相邻/重叠的条目脚本之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在创建一个在PostgreSQL 9.2.4中存储任意日期/时间范围的数据库.我想在这个数据库上设置一个约束,它强制日期/时间范围不重叠,并且不相邻(因为两个相邻的范围可以表示为单个连续范围).

为此,我使用带有GiST索引的EXCLUDE约束.这是我目前的约束:

ADD CONSTRAINT overlap_exclude EXCLUDE USING GIST (
    box(
        point (
            extract(EPOCH FROM "from") - 1,extract(EPOCH FROM "from") - 1
        ),point (
            extract(EPOCH FROM "to"),extract(EPOCH FROM "to")
        )
    ) WITH &&
);

来自和来自的列都是TIMESTAMP WITHOUT TIME ZONE,并且是以UTC格式存储的日期/时间(在我的应用程序中将数据插入这些列之前,我转换为UTC,并且我在postgresql.conf中将我的数据库的时区设置为“UTC” ).

但是,我想我可能遇到的问题是,这个约束正在做出(错误的)假设,即没有小于一秒的时间增量.

值得注意的是,对于我存储的特定数据,我只需要第二个分辨率.但是,我觉得我可能仍然需要处理这个问题,因为SQL类型的时间戳和timestamptz的分辨率都高于一秒.

我的问题是:是否有任何问题只是假设第二个解决方案,因为这是我的所有应用程序需要(或想要),或者,如果有,我怎么能改变这个约束来处理一秒钟的分数健壮的方式?

范围类型 consist of a lower and an upper border,which can be included or excluded.
典型用例(范围类型的默认值)是包含下限并排除上限.

排除重叠范围似乎很清楚.有一个nice code example in the manual

此外,使用adjacent operator -|-创建另一个排除约束以排除相邻条目.两者都必须基于GiST索引,因为目前不支持GIN.

我会对所有条目强制执行[)界限.您可以使用range functions添加CHECK constraint

CREATE TABLE tbl (
   tbl_id serial PRIMARY KEY,tsr tsrange,EXCLUDE USING gist (tsr WITH &&)               -- no overlapping,EXCLUDE USING gist (tsr WITH -|-)              -- no adjacent,CHECK (lower_inc(tsr) AND NOT upper_inc(tsr))  -- enforce [) bounds
);

SQL Fiddle.

总结

以上是脚本之家为你收集整理的使用PostgreSQL中的EXCLUDE防止相邻/重叠的条目全部内容,希望文章能够帮你解决使用PostgreSQL中的EXCLUDE防止相邻/重叠的条目所遇到的程序开发问题。

如果觉得脚本之家网站内容还不错,欢迎将脚本之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您喜欢交流学习经验,点击链接加入脚本之家官方QQ群:1065694478
脚本之家官方公众号

微信公众号搜索 “ 程序精选 ” ,选择关注!

微信公众号搜索 “ 程序精选 ”
精选程序员所需精品干货内容!