问题描述
我有一张桌子,如下所示:
CREATE TABLE appointments (
id SERIAL PRIMARY KEY,date TIMESTAMP NOT NULL,start_mn INT NOT NULL,end_mn INT NOT NULL,EXCLUDE using gist((array[start_mn,end_mn]) WITH &&)
)
我想防止行之间的start_mn和end_mn重叠,所以我添加了要点排除:
EXCLUDE using gist((array[start_mn,end_mn]) WITH &&)
但是插入以下两个不会触发排除:
INSERT INTO appointments(date,start_mn,end_mn) VALUES('2020-08-08',100,200);
INSERT INTO appointments(date,90,105);
如何实现此排除?
解决方法
如果要防止重叠的 range ,则必须使用range type而不是数组。
我还假定开始和结束在同一天绝对不能重叠,因此您需要在排除约束中包括date
列:
CREATE TABLE appointments
(
id SERIAL PRIMARY KEY,date TIMESTAMP NOT NULL,start_mn INT NOT NULL,end_mn INT NOT NULL,EXCLUDE using gist( int4range(start_mn,end_mn,'[]') WITH &&,"date" with =)
)
如果start_mn
和end_mn
应该是“一天中的时间”,那么这些列应定义为time
,而不是整数。