简体   繁体   English

更改更新触发器以在MySQL中插入触发器

[英]Changing an update trigger to insert trigger in MySQL

I am a beginner and studying about trigger to calculate grade of students from this link. 我是一个初学者,正在研究有关如何通过此链接计算学生成绩的触发器。 Student_Marks Trigger The query for before update trigger works fine. Student_Marks触发器 更新前 触发器的查询工作正常。 I was trying to change the trigger a little bit. 我试图改变一下触发器。 I want to calculate the Grade after inserting marks of a student. 我想在插入学生分数后计算成绩。 Hence, after trigger instead of update . 因此,触发而不是更新 I got stuck. 我被困。

My query is as follows: 我的查询如下:

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;
$$  

You have to use BEFORE INSERT instead of AFTER INSERT to save the calculated value of the new row. 您必须使用BEFORE INSERT而不是AFTER INSERT来保存新行的计算值。 You can't affect the row AFTER INSERT because the row is already saved. 您不能影响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;
$$  

You also need to change the table name for the TRIGGER (use INSERT ON student_marks instead of INSERT ON student ). 您还需要更改TRIGGER的表名(使用INSERT ON student_marks而不是INSERT ON student )。

demo on dbfiddle.uk 关于dbfiddle.uk的演示

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM