如何从触发器MySQL更新多个列

时间:2013-03-23 08:25:51

标签: php mysql sql triggers sql-update

嗨我正在使用mysql触发器来更新另一个表的插入

上的表

此触发器工作正常

CREATE TRIGGER `update_pupil_subject` AFTER INSERT ON `pupil_marks`
FOR EACH ROW  
BEGIN
   UPDATE  pupil_subjects  SET NumberOfStudens = NumberOfStudens + 1  WHERE NEW.SubjectID = SubjectID;
END$$

但这会产生错误

CREATE TRIGGER `update_pupil_subject` AFTER INSERT ON `pupil_marks`
FOR EACH ROW  
BEGIN
   UPDATE  pupil_subjects  SET NumberOfStudens = NumberOfStudens + 1 , AverageMarks = (SELECT AVG(Marks) FROM pupil_marks WHERE NEW.StudentID = StudentID ) WHERE NEW.SubjectID = SubjectID;
END$$

enter image description here

如何正确写这个,请帮忙。提前谢谢。

2 个答案:

答案 0 :(得分:1)

使用子查询时显然存在问题:

您可以尝试拆分SQL语句:

DELIMITER $$

CREATE TRIGGER `update_pupil_subject`
   AFTER INSERT
   ON `pupil_marks`
   FOR EACH ROW
BEGIN
   DECLARE avg_marks   float;

   SELECT AVG(Marks)
     INTO avg_marks
     FROM pupil_marks
    WHERE NEW.SubjectID = SubjectID;

   UPDATE pupil_subjects
      SET NumberOfStudens = NumberOfStudens + 1, AverageMarks = avg_marks
    WHERE NEW.SubjectID = SubjectID;
END
$$

编辑:使用

SHOW TRIGGERS WHERE `table` = 'pupil_marks';

获取pupil_marks上定义的所有触发器。您不能在事件上拥有多个触发器,因为所有操作都可以在单个触发器中涵盖。

注意:我认为AVG(Marks)适用于给定主题,因此修改了触发器定义。

答案 1 :(得分:1)

在触发器中声明一个变量,并使用子查询

进行分配

声明avg_mark整数默认为0; set avg_mark:=(SELECT AVG(Marks)FROM pupil_marks WHERE NEW.StudentID = StudentID);

然后在更新语句中使用变量“avg_mark”... 它可能有用......

如果没有,那么检查phpmyadmin sql框下方的分隔符。它应该是“$$”