如何防止 int 范围重叠

How to prevent overlapping of int ranges

我有一个 table 如下:

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, start_mn, end_mn) VALUES('2020-08-08', 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,而不是整数。