Postgresql 如何添加';它是部分的,也适用于postgres的重叠日期范围?

Postgresql 如何添加';它是部分的,也适用于postgres的重叠日期范围?,postgresql,constraints,date-range,Postgresql,Constraints,Date Range,我在thing\u thing表中使用了一个名为valid\u period的带有日期范围的postgres字段 用于添加约束的查询 如果不存在树,则创建扩展; 改变桌子上的东西 添加约束防止\u重叠\u有效\u期间\u由\u团队 使用gist排除(团队id为=,有效期为&&) 可延期的最初延期的; 这很有效 具有相同团队id的行和重叠的有效期=>已阻止您可以使用部分索引,至少对于PostgreSQL v13,您可以使用部分索引,但还没有检查其他行 请注意WHERE条件中的括号,如果您忘记

我在
thing\u thing
表中使用了一个名为
valid\u period
的带有日期范围的postgres字段

用于添加约束的查询

如果不存在树,则创建扩展;
改变桌子上的东西
添加约束防止\u重叠\u有效\u期间\u由\u团队
使用gist排除(团队id为=,有效期为&&)
可延期的最初延期的;
这很有效


  • 具有相同
    团队id的行
    和重叠的
    有效期
    =>已阻止您可以使用部分索引,至少对于PostgreSQL v13,您可以使用部分索引,但还没有检查其他行

    请注意
    WHERE
    条件中的括号,如果您忘记了这些条件,则表示抗议

    下面的示例根据您的描述稍微简化,但逻辑上相同

    =>创建表团队(团队id int不为null,有效期daterange不为null,已删除布尔值不为null,状态字符不为null);
    =>ALTER TABLE团队添加约束无重叠
    使用gist排除(团队id为=,有效期为&&)
    其中(is_removed=false或状态为('C','R'));
    =>插入团队值(1,日期范围('2020-01-01','2021-01-01'),假,'X');
    插入0 1
    =>插入团队值(1,日期范围('2020-01-01','2021-01-01'),假,'X');
    错误:冲突的键值违反排除约束“无重叠”
    详细信息:密钥(团队id,有效期)=(1[2020-01-012021-01-01])与现有密钥冲突(团队id,有效期)=(1[2020-01-012021-01-01))。
    =>插入团队值(1,日期范围('2020-01-01','2021-01-01'),true,'X');
    插入0 1
    =>插入团队值(1,日期范围('2020-01-01','2021-01-01'),true,'C');
    错误:冲突的键值违反排除约束“无重叠”
    详细信息:密钥(团队id,有效期)=(1[2020-01-012021-01-01])与现有密钥冲突(团队id,有效期)=(1[2020-01-012021-01-01))。
    
    谢谢你,Richard。我正在使用postgres 10。我会检查它是否在那里工作。顺便说一句,我检查了13个文档,但我找不到说明你所说的是明确可能的文档。无论是在还是如果你知道它在哪里,文档都可以为我指出。我想了解文档对此的说明,如果可能的话,知道吗在postgres 10中也是如此。我发现答案说这是不可能的,这让我很惊讶。奇怪。我不确定这是否可能,所以在psql()中检查了
    \h alter table
    ,并在
    table\u constraint
    部分
    排除…索引\u参数[WHERE(谓词)]
    。很高兴知道有几个版本支持它。谢谢。谢谢。我只是想说,我仍然觉得该页面很难阅读……也许是我很抱歉,我意识到如果我更改现有行,约束也会被阻止。不知您是否有解决方案?