如何防止int范围重叠

问题描述

我有一张桌子,如下所示:

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_mnend_mn应该是“一天中的时间”,那么这些列应定义为time,而不是整数。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...