【问题标题】:Mysql errno 1242 subquery returns for than one columnMysql 错误 1242 子查询返回多于一列
【发布时间】: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


【解决方案1】:
CREATE TRIGGER work_time_constraints
BEFORE INSERT ON shifts
FOR EACH ROW
BEGIN
IF EXISTS ( SELECT NULL
            FROM shifts 
            WHERE employeeID = NEW.employeeID
              AND DATE(start_time) < DATE(NEW.end_time)
              AND DATE(NEW.start_time) < DATE(end_time) ) THEN
    SIGNAL SQLSTATE '45000' SET MYSQL_ERRNO = 9997, MESSAGE_TEXT = 'Shift overlaps existing shift for this employee';
END IF;
END

【讨论】:

    猜你喜欢
    • 2016-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多