With constraints on ranges,我们会阻止在现有表格中添加任何重叠值。例如,在以下room_reservation表中,我们确保在冲突时间内没有预留任何空间。
CREATE EXTENSION btree_gist;
CREATE TABLE room_reservation (
room text,
during tsrange,
EXCLUDE USING GIST (room WITH =, during WITH &&)
);
我们在这里需要考虑的另一张桌子(房间)也有空间和场地,并在预订时考虑该桌子内的记录?
我们的具体方案是考试管理。我们有一个监考表(房间预订)和一个班级时间表。一旦我们添加一个监考记录,我们需要确保它与任何其他监考记录不一致,并确保那个房间当时没有讲座。
答案 0 :(得分:1)
您不能使用单个排除约束来执行此操作。相反,您应该在一个表上使用排除约束,比如invigilation
,然后在同一个表上使用BEFORE INSERT
触发器来检查第二个表中是否存在冲突,例如{{1} }。第一个表上的触发器函数将对第二个表进行简单的范围检查:
rooms
如果在某个房间安排了课程,则CREATE FUNCTION check_no_class() RETURNS trigger AS $$
BEGIN
PERFORM * FROM rooms
WHERE room = NEW.room
AND during && NEW.during;
IF FOUND THEN
RETURN NULL;
ELSE
RETURN NEW;
END IF;
END; $$ LANGUAGE plpgsql;
CREATE TRIGGER check_rooms
BEFORE INSERT ON invigilation
FOR EACH ROW EXECUTE PROCEDURE check_no_class();
上的插页将失败。