You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MySQL触发器中检查关联任务全完成后更新预订状态?

实现预订任务全完成时自动标记预订为完成的触发器

核心思路

要实现「当指定bookingID下所有任务的complete设为TRUE时,自动更新对应预订的complete为TRUE」的逻辑,核心是检查该预订下是否存在未完成的任务——如果不存在任何未完成任务,就标记预订为完成。我们可以通过MySQL触发器结合子查询实现这个逻辑。

基础实现(仅处理任务更新场景)

以下触发器会在tasks表的任务完成状态被更新后,自动检查对应预订的任务完成情况:

-- 临时修改语句分隔符,避免触发器体内的分号提前终止解析
DELIMITER //
CREATE TRIGGER update_booking_complete_after_task_update
AFTER UPDATE ON tasks
FOR EACH ROW
BEGIN
    -- 子查询检查当前预订下是否还有未完成的任务(complete=0)
    IF NOT EXISTS (
        SELECT 1 
        FROM tasks 
        WHERE bookingID = NEW.bookingID 
        AND complete = 0
    ) THEN
        -- 所有任务已完成,更新对应预订的complete字段为TRUE(1)
        UPDATE bookings 
        SET complete = 1 
        WHERE bookingsID = NEW.bookingID;
    END IF;
END //
-- 恢复默认分隔符
DELIMITER ;

扩展实现(覆盖新增/删除任务场景)

如果需要支持「新增最后一个任务并标记完成」或「删除最后一个未完成任务」的场景,可以补充以下两个触发器:

新增任务后检查的触发器

DELIMITER //
CREATE TRIGGER update_booking_complete_after_task_insert
AFTER INSERT ON tasks
FOR EACH ROW
BEGIN
    IF NOT EXISTS (
        SELECT 1 
        FROM tasks 
        WHERE bookingID = NEW.bookingID 
        AND complete = 0
    ) THEN
        UPDATE bookings 
        SET complete = 1 
        WHERE bookingsID = NEW.bookingID;
    END IF;
END //
DELIMITER ;

删除任务后检查的触发器

DELIMITER //
CREATE TRIGGER update_booking_complete_after_task_delete
AFTER DELETE ON tasks
FOR EACH ROW
BEGIN
    -- 删除触发器用OLD.bookingID获取被删除任务对应的预订ID
    IF NOT EXISTS (
        SELECT 1 
        FROM tasks 
        WHERE bookingID = OLD.bookingID 
        AND complete = 0
    ) THEN
        UPDATE bookings 
        SET complete = 1 
        WHERE bookingsID = OLD.bookingID;
    END IF;
END //
DELIMITER ;

进阶:支持任务取消完成的反向逻辑

如果需要在「某个任务被取消完成(从TRUE改回FALSE)」时,自动把对应预订的complete设为FALSE,可以修改UPDATE触发器:

DELIMITER //
CREATE TRIGGER update_booking_complete_after_task_update
AFTER UPDATE ON tasks
FOR EACH ROW
BEGIN
    -- 若任务从完成改为未完成,直接标记预订为未完成
    IF OLD.complete = 1 AND NEW.complete = 0 THEN
        UPDATE bookings 
        SET complete = 0 
        WHERE bookingsID = NEW.bookingID;
    ELSE
        -- 检查是否所有任务仍处于完成状态
        IF NOT EXISTS (
            SELECT 1 
            FROM tasks 
            WHERE bookingID = NEW.bookingID 
            AND complete = 0
        ) THEN
            UPDATE bookings 
            SET complete = 1 
            WHERE bookingsID = NEW.bookingID;
        END IF;
    END IF;
END //
DELIMITER ;

关键说明

  • NEW.bookingID:在UPDATE/INSERT触发器中,代表操作后记录的预订ID;DELETE触发器中用OLD.bookingID获取操作前记录的预订ID。
  • NOT EXISTS子查询:是核心判断逻辑——只要找不到该预订下任何未完成的任务,就判定所有任务已完成。

内容的提问来源于stack exchange,提问作者Alfie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 21:12:44