更新后的SQL触发器

时间:2018-11-16 13:29:35

标签: mysql

我在MySQL中使用SQL触发器时​​遇到了一些麻烦。下表仅用于测试。

第一张桌子:

CREATE TABLE `test`.`t1` (
  `c1` INT NOT NULL,
  `c2` VARCHAR(45) NULL,
  `c3` VARCHAR(45) NULL,
  PRIMARY KEY (`c1`));

第二张表:

CREATE TABLE `test`.`t2` (
  `cc1` INT NOT NULL,
  `cc2` VARCHAR(45) NULL,
  `cc3` VARCHAR(45) NULL,
  PRIMARY KEY (`cc1`));

cc1参考c1

我想做的是,如果c2中的值已更新,则应在cc2中更新相应的字段。 我想到的触发器是:

DROP TRIGGER IF EXISTS `test`.`t1_AFTER_UPDATE`; 

DELIMITER $$

USE `test`$$

CREATE DEFINER = CURRENT_USER TRIGGER `test`.`t1_AFTER_UPDATE` AFTER UPDATE ON `t1` FOR EACH ROW

BEGIN
     update t2

     set cc2=c2

     where t2.cc1=t1.c1;

END$$

DELIMITER ;

这执行没有错误,但是如果我尝试更新c2的值,

UPDATE `test`.`t1` SET `c2` = '23' WHERE (`c1` = '11');
  

操作失败:将SQL脚本应用于   数据库。错误1054:1054:“ where”中的未知列“ t1.c1”   条款”

如果我删除触发器,更新就会完成。

1 个答案:

答案 0 :(得分:0)

在触发器中,我们指的是用NEW(在操作后)和OLD(在操作前)关键字来更新/插入/删除的行中的列。

您将需要使用这些关键字才能更新另一个表。

此外,我们只有在UPDATE值发生变化的情况下,才能优化触发器以启动c2操作。

DROP TRIGGER IF EXISTS `test`.`t1_AFTER_UPDATE`; 
DELIMITER $$
USE `test`$$

CREATE DEFINER = CURRENT_USER TRIGGER `test`.`t1_AFTER_UPDATE` 
AFTER UPDATE ON `t1` FOR EACH ROW

BEGIN

  -- Check if there has been any change in the c2 value or not
  IF (NEW.c2 <> OLD.c2) THEN 

      -- Update only when there is some change 
      UPDATE t2
      SET cc2 = NEW.c2  -- access the recent updated value of c2 using NEW keyword
      WHERE cc1 = NEW.c1;  -- access the c1 value of updated row using NEW keyword
  END IF;

END$$

DELIMITER ;