mysql - 在 MySQL 中将更新触发器更改为插入触发器

标签 mysql database-trigger

我是一名初学者,正在研究通过此链接计算学生成绩的触发器。 Student_Marks Trigger 更新前触发器的查询工作正常。我试图稍微改变一下触发器。我想在插入学生的分数后计算成绩。 因此,之后触发而不是更新。我被卡住了。

我的查询如下:

DELIMITER 
$$
CREATE TRIGGER `student_marks` 
AFTER INSERT 
ON student FOR EACH ROW

BEGIN 
SET NEW.Total =NEW.SUB1+NEW.SUB2+NEW.SUB3+NEW.SUB4+NEW.SUB5; 
SET NEW.Percentage = NEW.Total/5;
IF NEW.Percentage >=90 THEN
SET NEW.Grade = 'EXCELLENT';
ELSEIF NEW.Percentage>=75 AND NEW.Percentage<90 THEN
SET NEW.Grade = 'VERY GOOD';
ELSEIF NEW.Percentage>=60 AND NEW.Percentage<75 THEN
SET NEW.Grade = 'GOOD';
ELSEIF NEW.Percentage>=40 AND NEW.Percentage<60 THEN
SET NEW.Grade = 'AVERAGE';
ELSE SET NEW.Grade = 'NOT PROMOTED';
END IF;
END;
$$  

最佳答案

您必须使用BEFORE INSERT而不是AFTER INSERT来保存新行的计算值。您无法影响 AFTER INSERT 行,因为该行已保存。

DELIMITER $$

CREATE TRIGGER `student_marks` 
BEFORE INSERT ON student_marks FOR EACH ROW
BEGIN 
    SET NEW.Total =NEW.SUB1+NEW.SUB2+NEW.SUB3+NEW.SUB4+NEW.SUB5; 
    SET NEW.Percentage = NEW.Total/5;

    IF NEW.Percentage >=90 THEN
        SET NEW.Grade = 'EXCELLENT';
    ELSEIF NEW.Percentage>=75 AND NEW.Percentage<90 THEN
        SET NEW.Grade = 'VERY GOOD';
    ELSEIF NEW.Percentage>=60 AND NEW.Percentage<75 THEN
        SET NEW.Grade = 'GOOD';
    ELSEIF NEW.Percentage>=40 AND NEW.Percentage<60 THEN
        SET NEW.Grade = 'AVERAGE';
    ELSE 
        SET NEW.Grade = 'NOT PROMOTED';
    END IF;
END;
$$  

您还需要更改 TRIGGER 的表名称(使用 INSERT ON Student_marks 而不是 INSERT ON Student)。

demo on dbfiddle.uk

关于mysql - 在 MySQL 中将更新触发器更改为插入触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55195308/

相关文章:

PHP 数组插入

php - $_POST 中的字符限制

MySQL触发器函数(3个不同表之间)

sql - 有没有办法默认触发器在特定用户上运行以进行 DML 操作?

json - 触发器以在 PostgreSQL 中从 JSON 对象创建记录

mysql - 按同一行中的日期值对值进行排序

php - mysql 按列名响应

mysql - Hive Metastore 服务器 (CDH) 启动失败

oracle - "after servererror on database trigger"是个好主意吗?

更新后mysql触发