MySQL基于多个因素(位置,日期和时间)对INSERT进行触发/检查

时间:2018-10-21 06:58:22

标签: mysql sql triggers

我有一个用于各种仓库的班次计划表。我正在尝试在数据库级别添加多个检查。如果我使用组合键(通过删除 shift_id )来匹配人员,位置,日期时间,则可以使用,但不能解决班次重叠问题(例如我插入与 shift_id 1 完全相同的数据,但开始时间不是09:00,而是09:01将被接受为有效班次)。

Schema

在下面的示例中,对于 shift_id 2 ,INSERT应该失败,因为对于相同的 staff_id 1 < / strong>在同一日期相同工作人员(在同一日期,同一位置或不同的位置)的下一个可用班次应在13:00之后可用。对于 shift_id 3 应该会再次失败,因为 staff_id 1 已经安排在另一个日期和同一小时位置( location_id 1 )。但是,应接受 * shift_id 4 * ,因为它不会与相同职员ID的轮班开始/结束重叠。

Conditions

我试图添加表约束以比较shift_start和shift_end,但未成功:

 ADD CONSTRAINT NoDoubleShifts CHECK(
    NOT EXISTS (
            SELECT 1
            FROM Shift S1, Shift S2
            WHERE s1.shift_date + s1.shift_start < s2.shift_date + s2shift_start
            AND s1.shift_date + s1.shift_end > s2.shift_Date + s2shift_start)

MySQL引发错误(我猜想该约束的格式不正确:“ 找到了一条语句,但在CHECK附近没有分隔符”。。)

第二种尝试的解决方案是在INSERT之前以不同的组合添加触发器,但是也没有用。正在计算时间,但阻止我在该时间段内添加其他任何工作人员(具有不同的ID)。

begin
  if exists (select * from shift
             where shift_start <= new.shift_end
             and shift_end >= new.shift_start ) then
    signal sqlstate '45000' SET MESSAGE_TEXT = 'Shifts are overlapping';
  end if;
end;

我们将不胜感激任何帮助和建设性的评论,或者任何向我指出正确方向的人。

谢谢。

1 个答案:

答案 0 :(得分:0)

就像尼克在评论中建议的那样,解决方案非常简单。因此,最终触发器将如下所示:

begin
  if exists (select * from shift
             where shift_start <= new.shift_end
             and shift_end >= new.shift_start
             and staff_id = new.staff_id) then
    signal sqlstate '45000' SET MESSAGE_TEXT = 'Shifts are overlapping';
  end if;
end

再次感谢尼克。...