我有各种仓库的班次计划表。我正在尝试在db级别添加多个检查。如果我使用复合键(通过删除shift\u id)来匹配人员、位置、日期和时间,它可以工作,但不能解决轮班重叠的问题(例如,如果我插入与shift\u id 1完全相同的数据,但不是09:00,则开始时间是09:01将接受为有效轮班)。
在下面的示例中,对于轮班标识2,插入应该失败,因为同一个员工的轮班时间在同一个日期重叠,同一个员工的下一个可用轮班(在同一个日期、同一个位置或不同的位置)应该在13:00之后可用。对于轮班,id 3应该是另一个失败,因为员工id 1已经被安排在完全相同的日期和时间到另一个位置(位置id 1)。但是,应接受轮班id 4,因为它与同一员工id的轮班开始/结束时间不重叠。
我试图添加表约束来比较shift\u start和shift\u 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附近没有分隔符”)。
第二种尝试性的解决方案是在插入之前添加触发器,以不同的组合插入,但也不起作用。正在计算时间,但阻止我在该时间段添加任何其他人员(具有不同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条答案
按热度按时间xpszyzbs1#
正如尼克在评论中所说,解决办法非常简单。因此,最后的触发器看起来像:
再次感谢尼克。。。。