验证SQL中时间段的统一性

时间:2014-07-11 10:33:26

标签: sql sqlite

我有一个格式为

的表格
CREATE TABLE TimePeriod(
    startTime integer NOT NULL, 
    endTime integer NOT NULL, 
    otherData TEXT
)

我需要确保时间段之间没有重叠。

示例:

  • 我有一行startTime 11:00和endTime 13:00已在数据库中;
  • 不允许以startTime 10:30和endTime 11:30插入行;
  • 不允许以startTime 12:30和endTime 13:30插入行;
  • 不允许以startTime 11:30和endTime 12:30插入行;
  • 允许以startTime 13:00和endTime 14:30插入行。

Obs:我使用SQLite并且我将时间存储为午夜以来的秒数,如果需要,我可以更改表格结构。

1 个答案:

答案 0 :(得分:1)

CHECK约束可能不包含子查询,因此您必须使用触发器。

为防止插入行,触发器必须评估RAISE功能。 当没有找到具有重叠时间的其他行时,WHERE过滤器会阻止此操作:

CREATE TRIGGER prevent_overlapping_time
BEFORE INSERT ON TimePeriod
FOR EACH ROW
BEGIN
    SELECT RAISE(ABORT, 'overlapping time')
    FROM TimePeriod
    WHERE NEW.endTime > startTime
      AND NEW.startTime < endTime;
END;