添加触发器

时间:2017-12-04 16:51:37

标签: mysql sql mysql-workbench

我是SQL的新手,更具体地说是使用MySQL Workbench。

我创建了一个包含两个表Grades和GPAList的数据库。

我想获取成绩中每个条目的平均值(按学生ID分组[sid是列的名称])一旦我有了这些平均值,就将它们与相应的学生一起存储在GPAList表中。这是为了在每次将新条目添加到Grades时触发。

这是我创建的触发器:

CREATE DEFINER = CURRENT_USER TRIGGER `ProjectName`.`Grades_AFTER_UPDATE_1` AFTER UPDATE ON `Grades` FOR EACH ROW
BEGIN
SELECT sid, SUM ( CASE grade
                    when 'A' then 4.0
                    when 'B' then 3.5
                    when 'C' then 3.0
                    when 'D' then 2.5
                    when 'F' then 1.0
                    else 0
                end
                ) / COUNT(*) Grades
INTO GPAList
FROM Grades
GROUP BY sid;
END

我遇到的错误是:

Error 1064: You have an error in your SQL syntax; check the manual that
 corresponds to your MySQL server version for the right syntax to use near '' at 
line 1 SQL Statement:  CREATE DEFINER = CURRENT_USER TRIGGER 
`ProjectName`.`Grades_AFTER_UPDATE_1` AFTER UPDATE ON `Grades` FOR EACH ROW 
FOLLOWS `Grades_AFTER_UPDATE`

当我在工作台中编写此代码时,不会显示语法错误。当我尝试应用此触发器时,我的代码将转换为:

DROP TRIGGER IF EXISTS `ProjectName`.`Grades_AFTER_UPDATE_1`;

    DELIMITER $$
    USE `ProjectName`$$
    CREATE DEFINER = CURRENT_USER TRIGGER `ProjectName`.`Grades_AFTER_UPDATE_1` AFTER UPDATE ON `Grades` FOR EACH ROW FOLLOWS `Grades_AFTER_UPDATE`
    $$
    DELIMITER ;

仅在再次单击“应用”后才能看到上面列出的1064错误。是否有一些我想念的简单修复?

Grades_AFTER_UPDATE_1正在关注Grades_AFTER_UPDATE,因此不应该出现问题。

1 个答案:

答案 0 :(得分:0)

我不确定为什么你想在单个插入后存储所有平均值,但正确的插入逻辑是这样的:

INSERT INTO GPALIST(sid, grades)
    SELECT sid,
           AVG (CASE grade
                    when 'A' then 4.0
                    when 'B' then 3.5
                    when 'C' then 3.0
                    when 'D' then 2.5
                    when 'F' then 1.0
                    else 0
                 end) as Grades
   FROM Grades
   GROUP BY sid;

我怀疑触发器会想要在途中某处访问new.