mysql - mysql 中触发器的问题

标签 mysql triggers

我是触发器新手。如果我提出了任何愚蠢的问题,请原谅。我试图编写一个触发器,它将根据 sol_erp_2014_academic_course_master 表中的更改来更新 sol_erp_2014_admission_academic_course_master 表中的字段值(名称)。在下面,我提到了我编写的表和触发器的结构。

sol_erp_2014_academic_course_master表的结构:

CREATE TABLE IF NOT EXISTS `sol_erp_2014_academic_course_master` (
      `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'cbcs_major_id',
      `major_type` int(11) NOT NULL,
      `section_id` int(11) NOT NULL,
      `academic_institute_id` int(11) NOT NULL,
      `academic_department_id` int(11) NOT NULL,
      `specialization_id` varchar(255) NOT NULL DEFAULT '0',
      `code` varchar(200) NOT NULL,
      `name` varchar(200) NOT NULL,
      `unit` int(11) NOT NULL,
      `no_of_year` int(11) NOT NULL,
      `max_num_of_year` int(11) NOT NULL,
      `no_of_sem` int(11) NOT NULL,
      `tot_min_credit` int(11) NOT NULL,
      `tot_max_credit` int(11) NOT NULL,
      `min_sem_pass_prctng` decimal(4,2) NOT NULL,
      `routine_system` int(11) NOT NULL COMMENT '1->Day System; 2-> Week System',
      `exam_evalution_grade_master_id` int(11) NOT NULL,
      `status` enum('0','1') NOT NULL DEFAULT '1',
      `date_added` date NOT NULL,
      `date_edited` date NOT NULL,
      `is_deleted` int(2) NOT NULL DEFAULT '0',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 COMMENT='MAJOR' AUTO_INCREMENT=1 ;

sol_erp_2014_admission_academic_course_master表的结构:

CREATE TABLE IF NOT EXISTS `sol_erp_2014_admission_academic_course_master` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `academic_institute_id` int(11) NOT NULL,
  `academic_department_id` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  `status` enum('0','1') NOT NULL DEFAULT '1',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

现在触发我所写的内容:

DELIMITER $$

DROP TRIGGER /*!50032 IF EXISTS */ `erp_adbu`.`sol_erp_2014_academic_course_master_update_before`$$

CREATE
    /*!50017 DEFINER = 'root'@'%' */
    TRIGGER `sol_erp_2014_academic_course_master_update_before` BEFORE UPDATE ON `sol_erp_2014_academic_course_master` 
    FOR EACH ROW BEGIN
    DECLARE name_var VARCHAR(255);
    DECLARE id_var INT;

    SELECT name
    INTO name_var 
    FROM sol_erp_2014_academic_course_master
    WHERE sol_erp_2014_academic_course_master.id = NEW.id;

    UPDATE sol_erp_2014_admission_academic_course_master SET name = name_var WHERE id = NEW.id;
    END;
$$

DELIMITER ;

现在我正在更新 sol_erp_2014_academic_course_master 表中的记录。但sol_erp_2014_admission_academic_course_master表的相应记录没有更新。

有人可以帮我吗?

提前致谢。

最佳答案

您现有的触发器存在两个问题:

  1. 它应该是 AFTER 触发器,而不是 BEFORE 触发器
  2. 您不需要声明任何变量。您可以在更新中使用 NEW.name 值。

尝试这样的事情:

DELIMITER $$

DROP TRIGGER /*!50032 IF EXISTS */ `erp_adbu`.`sol_erp_2014_academic_course_master_update_before`$$

CREATE
    /*!50017 DEFINER = 'root'@'%' */
    TRIGGER `sol_erp_2014_academic_course_master_update_before` AFTER UPDATE ON `sol_erp_2014_academic_course_master` 
    FOR EACH ROW BEGIN
      UPDATE sol_erp_2014_admission_academic_course_master SET name = NEW.name WHERE id = NEW.id;
    END;
$$

DELIMITER ;

关于mysql - mysql 中触发器的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36219010/

相关文章:

php - 如何解析 Mysql 存储过程中的 PHP Searilize 数据并循环它

c# - WPF 事件触发器更改其他 UI 元素

mysql - 触发器正在复制数据

MySQL 触发器删除整个表而不是一个条目

php - 删除一行或多行后,在 auto_increment 列上使用下一个可能的主键

mysql - 同时选择该字段的最小日期和最大日期

mysql - 在不丢失其他元数据的情况下更改 MySQL 中的列数据类型(DEFAULT、NOTNULL...)

php - MySql - 一对多关系

mysql - #1054 - 'field list' 中的未知列

php - MySQL 级联删除自引用父子表?