我正在创建一个数据库,用于存储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 &&
);
列from
和to
都是TIMESTAMP WITHOUT TIME ZONE
类型,存储的是UTC时间(在我的应用程序中插入数据之前将其转换为UTC,并在postgresql.conf中将数据库的时区设置为“UTC”)。
然而我担心的问题是,这个约束条件可能会错误地假定时间增量不小于一秒。
值得注意的是,对于我存储的特定数据,我只需要秒级分辨率。但是,我认为我仍然需要处理这个问题,因为SQL类型timestamp
和timestamptz
比一秒钟更高的分辨率。
我的问题要么是:假设我的应用程序只需要(或希望)秒级分辨率,那么只假定秒级分辨率是否有问题?如果有问题,如何以健壮的方式修改此约束条件来处理小于一秒的时间分数?
tsrange
会使这变得十分简单,并且还能使用其他范围操作符,这对于使用和管理这些数据非常有帮助。谢谢! :) - CmdrMoozyON CONFLICT
子句涵盖了与EXCLUSION
约束冲突的情况,但仅适用于DO NOTHING
。手册:请注意,排除约束不支持作为具有ON CONFLICT DO UPDATE的仲裁者。
请考虑我上面添加的更新的db<>fiddle中的演示。 - Erwin Brandstetter