首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无重叠数据

无重叠数据
EN

Stack Overflow用户
提问于 2022-03-06 18:03:49
回答 2查看 139关注 0票数 0

作为postgres的新用户,我在postgres 13中创建了一个数据库。

  1. ID整数(PK)
  2. HoleID varchar(20)
  3. 来自数字NULL检查(From>=0)
  4. 改为数字
  5. Cat varchar (20)

我想要创建一个约束,它将检查相同的实体号,记录的From和to字段不能与另一个记录重叠。

我提议了下面的排除约束,但它不起作用。

使用GIST添加约束no_overlap排除("HoleID“WITH =,("mFrom","mTo") WITH &);

谢谢你对我的照顾。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-03-07 08:48:54

您可以创建这样的约束:

代码语言:javascript
复制
ALTER TABLE tab
ADD CONSTRAINT no_overlap EXCLUDE USING gist (
   "HoleID" WITH =,
   numrange("mFrom", "mTo") WITH &&
);

你不应该将时间戳存储为数字。

票数 0
EN

Stack Overflow用户

发布于 2022-03-06 20:25:48

使用单个numrange列而不是from/to更容易实现这一点。

代码语言:javascript
复制
create table thing (
  id bigserial primary key,
  holeid varchar(20),
  range numrange not null,
  exclude using gist (range with &&, holeid with =)
);

insert into thing (holeid, range) values
  ('foo', '[1, 10]'::numrange),
  -- ok, same holeid, does not overlap
  ('foo', '[10.1, 11]'::numrange),
  -- ok, different holeid, overlaps.
  ('bar', '[2,5]'::numrange),
  -- not ok, same holeid, overlaps.
  ('foo', '[0, 1]'::numrange);

游行示威

请注意,[]是包容性的,而()是独占的。(1,10)::numrange(10,20)::numrange不重叠。[1,10]::numrange[10,20]::numrange是重叠的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71372944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档