我在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
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” 条款”
如果我删除触发器,更新就会完成。
答案 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 ;