Postgresql - 范围的约束 - 两个表

时间:2016-04-19 08:33:10

标签: postgresql

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 &&)
);

我们在这里需要考虑的另一张桌子(房间)也有空间和场地,并在预订时考虑该桌子内的记录?

我们的具体方案是考试管理。我们有一个监考表(房间预订)和一个班级时间表。一旦我们添加一个监考记录,我们需要确保它与任何其他监考记录不一致,并确保那个房间当时没有讲座。

1 个答案:

答案 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(); 上的插页将失败。