简单的SQL约束问题

时间:2011-05-22 20:10:30

标签: sql postgresql

我无法让我认识到应该是一个简单的SQL约束。假设我有下表:

create table event(
    eventID    serial PRIMARY KEY,
    eventDate  date,
    start      time,
    end        time
);

我想要一个约束,说明任何两个事件都不能重叠;也就是说,如果两个事件在同一天,一个事件的开始时间必须在另一个事件的结束时间之后,反之亦然。

在命题逻辑中,我会像

那样
FORALL e1,e2 in Events, e1.date = e2.date IMPLIES  (e1.start > e2.end OR e2.start > e1.end)

即。几乎无足轻重。我对SQL很新,我只是看不出怎么做同样的事情!有什么指针吗?

由于 汤姆

3 个答案:

答案 0 :(得分:1)

您需要使用触发器在每次插入或更新时检查新事件是否与前一个事件的日期/时间相同。

请参阅PostgreSQL文档了解触发器here

CREATE TRIGGER Trigger_check_overlap
BEFORE INSERT OR UPDATE ON event
FOR EACH ROW
EXECUTE PROCEDURE check_overlap();

Here是触发器过程的文档,请注意NEW特殊变量,它允许您单独插入要插入的元素。因此,您可以将NEW.date与表中已有的日期进行比较。

答案 1 :(得分:0)

对sql触发器进行一点搜索,它们就像是在尝试添加,更新或删除ur表中的记录时发生的事件。你可以写你的脚本来检查你的约束。

快乐的编码。

答案 2 :(得分:0)

首先,您想跳到这篇文章,该文章解释了如何优化此类查询:

PostgreSQL matching interval between start and end time against timestamp

添加了一个框列后,您想要添加exclude约束(这将自动添加索引):

exclude (datetime_box with &&) using gist

http://www.postgresql.org/docs/current/static/sql-createtable.html

此外,如果您不知道,请注意存储时区:

http://derickrethans.nl/storing-date-time-in-database.html