【问题标题】:Prevent date overlap postgresql防止日期重叠postgresql
【发布时间】:2016-06-13 13:14:28
【问题描述】:

有没有办法向 postgresql 表添加约束以防止日期重叠?例如,我有一个名为workouts 的表,其中包含日期列week_startweek_end。我想确保没有一个 week_start - week_end 范围与任何现有范围重叠。但是,week_start 的结束日期可能与week_end 的开始日期重叠。

有人可以帮忙吗?

提前致谢!

【问题讨论】:

  • 所以您使用的是周数?如果是这样,则周日期之间不能有重叠。

标签: postgresql date overlap


【解决方案1】:

您可以使用exclusion constraint 执行此操作,将overlap operator (&&) 用于daterange type

CREATE TABLE workouts (
  week_start DATE,
  week_end DATE,
  EXCLUDE USING gist (daterange(week_start, week_end) WITH &&)
)

【讨论】:

  • 谢谢 - 确认一下,这是否允许 week_start 的结束与 week_end 的开始重叠?例如,应允许 6/1 - 6/3 和 6/3 - 6/4。
  • @user1547174:是的,daterange() 函数包括下限,不包括上限。
  • 知道了——我尝试了命令alter table workouts add constraint EXCLUDE USING gist (daterange(week_start, week_end) WITH &&);,但我得到了ERROR: syntax error at or near "USING"...你能告诉我语法错误可能是什么吗?
  • @user1547174:您需要为约束命名 (ADD CONSTRAINT c EXCLUDE ...) 或完全删除 CONSTRAINT 关键字 (ADD EXCLUDE ...)
  • @Adzz:实际上,是的,看起来有一个known issue 会导致同时重叠插入引发死锁错误,而不是约束冲突错误。这对于大多数用例来说并不重要 - 无论如何它都会失败,只是出现不同的错误消息 - 但如果您需要高吞吐量并且您预计会有很多违规行为(因为有一些延迟),这可能是一个真正的问题在死锁检测开始之前)。
【解决方案2】:

您可以将EXCLUDE 表约束添加到表定义中,然后使用范围来检测重叠。如果您可以更改表定义以将列 week_startweek_end 转换为单个范围,例如 weeks,这将非常有用。

CREATE TABLE workouts (
  ...
  weeks   intrange
  EXCLUDE USING gist (weeks WITH &&)
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-04
    相关资源
    最近更新 更多