无重叠数据
No overlapping data
作为 postgres 的新用户,我在 postgres 13 中创建了一个数据库。它包含表
包括 4 个字段
- ID整数(PK)
- 孔 ID varchar(20)
- 来自数字 NOT NULL CHECK(来自 >=0)
- 转为数字
- 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);
请注意,[]
是包容性的,()
是独占性的。 (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 &&
);
永远不要将时间戳存储为数字。
作为 postgres 的新用户,我在 postgres 13 中创建了一个数据库。它包含表 包括 4 个字段
- ID整数(PK)
- 孔 ID varchar(20)
- 来自数字 NOT NULL CHECK(来自 >=0)
- 转为数字
- 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);
请注意,[]
是包容性的,()
是独占性的。 (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 &&
);
永远不要将时间戳存储为数字。