我是 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 ;
当你说
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。