无重叠数据

No overlapping data

作为 postgres 的新用户,我在 postgres 13 中创建了一个数据库。它包含表 包括 4 个字段

  1. ID整数(PK)
  2. 孔 ID varchar(20)
  3. 来自数字 NOT NULL CHECK(来自 >=0)
  4. 转为数字
  5. Cat varchar (20)

我想创建一个约束条件来检查对于相同的实体编号,一条记录的 From 和 To 字段不得与另一条记录重叠。

我在下面提出了排除约束,但它不起作用

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

谢谢你帮助我。

使用单个 numrange 列而不是 from/to 更容易。

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);

Demonstration.

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

您可以这样创建约束:

ALTER TABLE tab
ADD CONSTRAINT no_overlap EXCLUDE USING gist (
   "HoleID" WITH =,
   numrange("mFrom", "mTo") WITH &&
);

永远不要将时间戳存储为数字。