如何创建INSERT触发器自动计算成绩总和写入get_total字段
问题说明
现有成绩表exam_group_exam_results结构及样例数据如下:
student_id | subject_id | get_ca1 | get_ca2 | get_exam | get_total ---------------------------------------------------------------------- 101 | 1 | 10 | 7 | 10 | 102 | 2 | 5 | 5 | 10 | 103 | 1 | 9 | 10 | 4 | 101 | 1 | 8 | 10 | 10 | 103 | 2 | 2 | 10 | 10 | 104 | 1 | 7 | 8 | 5 | 101 | 2 | 7 | 8 | 5 |
需求:创建行级触发器,插入记录时自动计算get_ca1、get_ca2到get_exam的分数总和,写入当前记录的get_total字段。
你编写的触发器存在以下错误:
- 触发器名包含多余空格,命名不规范
- 触发时机选了
AFTER INSERT,数据写入完成后无法直接修改新行的字段值,必须使用BEFORE INSERT在写入前完成赋值 - 未使用
NEW关键字引用新插入行的字段,直接写字段名无法定位到当前操作的行 - 目标字段名写错,需要赋值的字段是
get_total,不是语句中的get_tot_score - 求和公式中多写了表结构里不存在的
get_ca3~get_ca6字段,会触发字段不存在报错
正确实现(MySQL环境)
-- 存在同名触发器则先删除 DROP TRIGGER IF EXISTS trg_calc_total_on_insert; DELIMITER // CREATE TRIGGER trg_calc_total_on_insert BEFORE INSERT ON `exam_group_exam_results` FOR EACH ROW BEGIN -- 如果实际业务表存在ca3-ca6字段,直接在求和公式中追加对应NEW.字段名即可 SET NEW.get_total = NEW.get_ca1 + NEW.get_ca2 + NEW.get_exam; END // DELIMITER ;
扩展:如果需要修改成绩时自动重算总分,可以额外创建一个
BEFORE UPDATE触发器,逻辑完全一致,仅将触发时机从INSERT改为UPDATE即可。
内容的提问来源于stack exchange,提问作者MaryPebbles
相关产品推荐
相关产品推荐

