我在mysql中使用sql触发器中的if else构造时遇到了一些问题。下表仅用于测试。
第一张table:
CREATE TABLE `test2`.`t1` (
`c1` VARCHAR(5) NOT NULL,
`c2` VARCHAR(45) NULL,
`c3` VARCHAR(45) NULL,
PRIMARY KEY (`c1`));
我的第二张table:
CREATE TABLE `test2`.`t2` (
`cc1` VARCHAR(5) NOT NULL,
`cc2` VARCHAR(45) NULL,
`cc3` VARCHAR(45) NULL,
PRIMARY KEY (`cc1`));
第三点:
CREATE TABLE `test`.`t3` (
`ccc1` VARCHAR(5) NOT NULL,
`ccc2` VARCHAR(45) NULL,
`ccc3` VARCHAR(45) NULL,
PRIMARY KEY (`cc1`));
c1是cc1和ccc1的主键。
我使用的触发器是:
DROP TRIGGER IF EXISTS `test`.`t1_AFTER_UPDATE`;
DELIMITER $$
USE `test`$$
CREATE DEFINER=`root`@`localhost` TRIGGER `t1_AFTER_UPDATE` AFTER UPDATE ON
`t1` FOR EACH ROW
BEGIN
DECLARE start varchar(1);
set start=substring((c2),1,1);
IF(start='S') THEN
UPDATE t2
SET cc2 = NEW.c2
WHERE cc1 = NEW.c1;
else
UPDATE t3
SET ccc2 = NEW.c2
WHERE ccc1 = NEW.c1;
END IF;
END$$
DELIMITER ;
基本上,如果用户更新t1.c2,那么就必须更新t2.cc2或t3.ccc2。如果新的.c2的t1.c2以字母s开头,则必须更新t2.cc2,否则必须更新t3.ccc2。
查询执行得很顺利,但不允许我更新c2的值:
Executing:
UPDATE `test2`.`t1` SET `c2` = '24' WHERE (`c1` = 'M123');
Operation failed: There was an error while applying the SQL script to the database.
ERROR 1054: 1054: Unknown column 'c1' in 'field list'
SQL Statement:
2条答案
按热度按时间dfuffjeb1#
在触发器中,我们引用正在被更新/插入/删除的行中的列
NEW
(操作后),以及OLD
(操作前)关键字。您需要使用这些关键字才能访问这些值。您可以访问
c2
当前表中的值,使用NEW
关键字。当c2
值实际已修改。触发文档中值得注意的几点:
在触发器主体中,新旧关键字使您能够访问受触发器影响的行中的列。新旧的是mysql对触发器的扩展;它们不区分大小写。
在插入触发器中,只能使用new.col\u名称;没有旧的一排。在delete触发器中,只能使用old.col\u名称;没有新行。在更新触发器中,可以使用old.col\u name来引用更新前的行的列,使用new.col\u name来引用更新后的行的列。
r1zk6ea12#
你的扳机基本上没问题,除了
start
. 列引用缺少对的引用new.
我对错误信息感到困惑,它应该是开着的c2
而不是c1
不过。在任何情况下,我都会省去它:
你还需要修正
t3
. 主键列不存在。