我有一个简单的预订表:
id
date_start (date)
date_end (date)
编写触发器以禁止插入与另一个预订重叠的预订的正确方法是什么?
基本上,我不能有 2 个相互重叠的预订。
有没有解决这个问题的通用方法?
编写一个触发器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 更改确切的查询,但逻辑应该相同。请注意,通常从触发器引发异常将导致事务回滚并且不允许新的预订。