2

嗨,我正在使用 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$$

在此处输入图像描述

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

4

2 回答 2

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)是针对给定主题的,因此相应地修改了触发器定义。

于 2013-03-23T08:56:58.253 回答
1

在触发器中声明一个变量并用子查询分配它

声明 avg_mark 整数默认 0;设置 avg_mark := (SELECT AVG(Marks) FROM student_marks WHERE NEW.StudentID = StudentID);

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

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

于 2013-03-23T09:31:46.000 回答