【问题标题】:how to update multiple columns from a trigger MySQL如何从触发器 MySQL 更新多个列
【发布时间】:2013-03-23 08:25:50
【问题描述】:

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

如何正确写这个,请帮忙。在此先感谢。

【问题讨论】:

  • 查看查询 - 它缺少 END$$ 您是否在 CREATE TRIGGER 之前声明了 $$ 作为分隔符?
  • @dev-null-dweller 嗯,我做到了,但它没有说 #1235 - 这个版本的 MySQL 还不支持“一个表具有相同操作时间和事件的多个触发器”
  • 您需要为该特定事件在表上放置触发器!
  • @KanishkaPanamaldeniya 在创建新触发器之前,您必须先删除之前的触发器 (DROP TRIGGER update_pupil_subject)
  • 啊哈,伙计们,非常感谢,我会这样做的 :)

标签: php mysql sql triggers sql-update


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

【讨论】:

  • 谢谢,但是给出了错误,#1235 - 这个版本的 MySQL 还不支持“一个表的多个触发器具有相同的操作时间和事件”我的 MySQL 版本是 5.5.8跨度>
  • 您好,我试图从 nformation_schema.triggers 表中删除该记录,但它说访问被拒绝,我无法删除该记录:(,我该怎么办
  • 使用DROP TRIGGER [IF EXISTS] [schema_name.]trigger_nameDROP TRIGGER yourDBName.update_pupil_subject 如果你能够创建触发器,我想你也应该能够删除它们。
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    相关资源
    最近更新 更多