【发布时间】:2021-07-12 17:50:21
【问题描述】:
我创建了一个触发器,以确保员工班次不与该员工的另一班次重叠,但是当员工在同一天有超过一个班次时,我收到错误“子查询返回多于一列”存在解决这个问题?
delimiter //
CREATE TRIGGER work_time_constraints
BEFORE INSERT ON shifts
FOR EACH ROW
BEGIN
IF new.start_time BETWEEN (SELECT start_time FROM shifts WHERE new.employeeID = employeeID
AND CONVERT(new.start_time, DATE) = CONVERT(start_time, DATE))
AND (SELECT end_time FROM shifts WHERE new.employeeID = employeeID AND CONVERT(new.end_time,
DATE) = CONVERT(end_time, DATE))
OR new.end_time BETWEEN (SELECT start_time FROM shifts WHERE new.employeeID = employeeID AND
CONVERT(new.start_time, DATE) = CONVERT(start_time, DATE))
AND (SELECT end_time FROM shifts WHERE new.employeeID = employeeID AND CONVERT(new.end_time,
DATE) = CONVERT(end_time, DATE))
THEN SIGNAL SQLSTATE '45000'
SET MYSQL_ERRNO = 9997,
MESSAGE_TEXT = 'Shift overlaps existing shift for this employee';
END IF;
END//
delimiter ;
【问题讨论】:
-
您的子查询 (
(SELECT start_time FROM ..) 确实可能返回不止一行。 PS。你的逻辑是错误的。想象一下,要测试的转变完全包括一些转变——你的逻辑不会测试重叠这样的情况。
标签: mysql error-handling triggers