触发器不会在 MySQL 数据库中触发

问题描述 投票:0回答:1

我是 MySQL 新手,正在为评估项目创建数据库。作为其中的一部分,我需要创建一个触发器并演示它是如何工作的。

数据库中的学校属于一个称为集群的组(cluster_no:A、B、C 或 D)并参加会议 (1-6)。有一个名为“集群”的表,其中包含有关谁运行集群会议、举行会议以及出席登记是否已完成的信息。 “集群出席记录”表包含会议的出席登记。

会话 1-3 的记录在“集群出勤记录”中已完成,并且我创建了触发器,以便在为未来会话更新“集群出勤记录”时向表“集群”添加语句。我们的想法是,在集群会议结束后,我会知道谁参加了会议,并且可以在“集群出勤记录”中更新每所学校的记录。这些是布尔值,对于会话 4-6 设置为 0,因为我有一个计算出勤率的视图,该视图不适用于 NULL。

我必须对其进行设置,以便每个会话(会话 4-6)的每个 cluster_no 有一个不同的触发器,但是当我更新 cluster_id 1、session_4 的记录时,“clusters”表中没有任何更改,如下所示我很期待。

聚类表:

集群考勤记录:

更新代码(这绝对有效,因为我在没有触发器的情况下尝试过)

UPDATE cluster_attendance_record
SET session_4 = 1 WHERE school_id IN ('S01', 'S02', 'S03', 'S05');

触发代码:

DELIMITER //
CREATE TRIGGER cA_s4_register_status
AFTER UPDATE
ON cluster_attendance_record 
FOR EACH ROW IF new.session_4 = 1 AND cluster_id = 'A'
THEN
    UPDATE clusters SET new.session_4 = 'REGISTER COMPLETE' 
    WHERE cluster_id = 'A';
END IF;
//
DELIMITER ;
mysql triggers sql-update
1个回答
1
投票

当你说

IF cluster_no = 1

您只需要澄清它是您在触发器定义中引用的新的、更新的值。

你可以这样做:

FOR EACH ROW IF NEW.cluster_no = 1

完整的工作示例:

create table cluster_attendance_record (cluster_no int);
create table clusters (cluster_no integer, session_4 varchar(30));

DELIMITER //
CREATE TRIGGER c1_s4_register_status
AFTER UPDATE
ON cluster_attendance_record 
FOR EACH ROW IF NEW.cluster_no = 1
THEN
    UPDATE clusters SET session_4 = 'REGISTER COMPLETE' 
    WHERE cluster_no = 1;
END IF;
//
DELIMITER ;


insert into cluster_attendance_record (cluster_no)
select 0;

insert into clusters (cluster_no, session_4)
select 1, "some_value";

update cluster_attendance_record set cluster_no = 1;

select * from cluster_attendance_record;
select * from clusters;

这是dbfiddle

© www.soinside.com 2019 - 2024. All rights reserved.