【问题标题】:constraint on overlapping intervals in postgres records对 postgres 记录中重叠间隔的约束
【发布时间】:2020-08-07 22:31:40
【问题描述】:

所以我正在做一个预订系统,我有下表用于预订。

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),

【问题讨论】:

    标签: sql postgresql date intervals


    【解决方案1】:

    文档中有几乎确切的场景(房间而不是展位):

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

    【讨论】:

    • 非常感谢,这正是我想要的!
    • 如果间隔容易频繁更新,您建议在 tsrange 列期间使用两个单独的日期列还是一个?
    • 我偏爱单独的日期列,因为我通常发现我只更新一个或另一个,并且每次更新时都必须包含两个值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多