对 postgres 记录中重叠间隔的约束
constraint on overlapping intervals in postgres records
所以我正在制作一个预订系统,我有以下 table 用于预订。
CREATE TABLE reservations (
user_id INT REFERENCES users (id),
booth_number INT REFERENCES booths (booth_number),
starts DATE NOT NULL,
ends DATE NOT NULL,
PRIMARY KEY (user_id, booth_number)
);
我想知道是否可以在数据库级别设置一个限制,禁止在同一展位插入重叠预订?
例如
INSERT INTO reservations( user_id, booth_number, starts, ends)
VALUES
(1, 0, CURRENT_DATE, CURRENT_DATE + 7),
(2, 0, CURRENT_DATE + 4, CURRENT_DATE + 9),
文档中几乎有确切的场景(房间而不是展位):
https://www.postgresql.org/docs/current/rangetypes.html#RANGETYPES-CONSTRAINT
”
您可以使用 btree_gist 扩展来定义普通标量数据类型的排除约束,然后可以将其与范围排除相结合以获得最大的灵活性。例如,安装 btree_gist 后,仅当会议室编号相等时,以下约束才会拒绝重叠范围:
CREATE EXTENSION btree_gist;
CREATE TABLE room_reservation (
room text,
during tsrange,
EXCLUDE USING GIST (room WITH =, during WITH &&)
);
修改以供您使用:
EXCLUDE USING GIST (booth_number WITH =, daterange(starts, ends, '[]') WITH &&))
所以我正在制作一个预订系统,我有以下 table 用于预订。
CREATE TABLE reservations (
user_id INT REFERENCES users (id),
booth_number INT REFERENCES booths (booth_number),
starts DATE NOT NULL,
ends DATE NOT NULL,
PRIMARY KEY (user_id, booth_number)
);
我想知道是否可以在数据库级别设置一个限制,禁止在同一展位插入重叠预订?
例如
INSERT INTO reservations( user_id, booth_number, starts, ends)
VALUES
(1, 0, CURRENT_DATE, CURRENT_DATE + 7),
(2, 0, CURRENT_DATE + 4, CURRENT_DATE + 9),
文档中几乎有确切的场景(房间而不是展位):
https://www.postgresql.org/docs/current/rangetypes.html#RANGETYPES-CONSTRAINT
” 您可以使用 btree_gist 扩展来定义普通标量数据类型的排除约束,然后可以将其与范围排除相结合以获得最大的灵活性。例如,安装 btree_gist 后,仅当会议室编号相等时,以下约束才会拒绝重叠范围:
CREATE EXTENSION btree_gist;
CREATE TABLE room_reservation (
room text,
during tsrange,
EXCLUDE USING GIST (room WITH =, during WITH &&)
);
修改以供您使用:
EXCLUDE USING GIST (booth_number WITH =, daterange(starts, ends, '[]') WITH &&))