我有一个用于各种仓库的班次计划表。我正在尝试在数据库级别添加多个检查。如果我使用组合键(通过删除 shift_id )来匹配人员,位置,日期时间,则可以使用,但不能解决班次重叠问题(例如我插入与 shift_id 1 完全相同的数据,但开始时间不是09:00,而是09:01将被接受为有效班次)。
在下面的示例中,对于 shift_id 2 ,INSERT应该失败,因为对于相同的 staff_id 1 < / strong>在同一日期相同工作人员(在同一日期,同一位置或不同的位置)的下一个可用班次应在13:00之后可用。对于 shift_id 3 应该会再次失败,因为 staff_id 1 已经安排在另一个日期和同一小时位置( location_id 1 )。但是,应接受 * shift_id 4 * ,因为它不会与相同职员ID的轮班开始/结束重叠。
我试图添加表约束以比较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;
我们将不胜感激任何帮助和建设性的评论,或者任何向我指出正确方向的人。
谢谢。
答案 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
再次感谢尼克。...