所以我正在做一个预订系统,我有一个预订的表格。
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)
);我想知道是否有可能在数据库级别上设置一个限制,禁止在同一展位上插入重叠的预订?
e.g
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),发布于 2020-08-08 06:35:19
几乎确切的场景(房间而不是展位)在文档中:
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 &&))https://stackoverflow.com/questions/63309918
复制相似问题