作为postgres的新用户,我在postgres 13中创建了一个数据库。
我想要创建一个约束,它将检查相同的实体号,记录的From和to字段不能与另一个记录重叠。
我提议了下面的排除约束,但它不起作用。
使用GIST添加约束no_overlap排除("HoleID“WITH =,("mFrom","mTo") WITH &);
谢谢你对我的照顾。
发布于 2022-03-07 08:48:54
您可以创建这样的约束:
ALTER TABLE tab
ADD CONSTRAINT no_overlap EXCLUDE USING gist (
"HoleID" WITH =,
numrange("mFrom", "mTo") WITH &&
);你不应该将时间戳存储为数字。
发布于 2022-03-06 20:25:48
使用单个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是重叠的。
https://stackoverflow.com/questions/71372944
复制相似问题