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

如何创建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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 10:27:29