嗨我正在使用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$$
如何正确写这个,请帮忙。提前谢谢。
答案 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框下方的分隔符。它应该是“$$”