如何编写触发器以防止预订日期重叠

时间:2012-12-30 02:33:59

标签: sql triggers

我有一张简单的预订表:

id
date_start (date)
date_end (date)

编写一个不允许插入与其他预订重叠的预订的触发器的正确​​方法是什么?

基本上,我不能有2个相互重叠的预订。

是否有解决此问题的通用方法?

1 个答案:

答案 0 :(得分:1)

写一个触发器ON INSERT OR UPDATE,当满足以下条件时抛出异常:

EXISTS
(
    SELECT 1
    FROM bookings
    WHERE date_start <= NEW.date_end
    AND date_end >= NEW.date_start
    AND (INSERTING OR id <> NEW.id)
)

date_start <= NEW.date_end AND date_end >= NEW.date_start条件将匹配与新记录的任何现有重叠。如果是UPDATE,INSERTING OR id <> NEW.id条件将排除当前记录(否则它将始终与自身重叠)。

请注意,如果您愿意,可以删除最后一个条件并使用两个单独的触发器 - 一个用于INSERT,另一个用于UPDATE。

您可能需要根据您的RDBMS更改确切的查询,但逻辑应该相同。请注意,通常从触发器抛出异常将导致事务被回滚并且不允许新的预订。