mysql触发器提供错误

nimxete2  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(281)

帐户表:在此处输入图像描述
mysql终端:在这里输入图像描述
我正在对accounts表做一个触发器,它将响应数据库中的任何更新或插入操作,这些更新或插入操作将为account类型提供除credit、checking或cash以外的任何值。
我尝试实现触发器(它编译过),但是每当我尝试添加一些不是现金、信用和支票的东西时,它都会给我一个错误。什么可以导致/修复此错误?

htzpubme

htzpubme1#

而不是执行 insert ,更换 OLD 通过将属性设置为 NEW :

IF OLD.type <> 'cash' and OLD.type <> 'credit' and OLD.type <> 'checking' THEN
    SET NEW.type = 'cash'
END IF;

存储在中的重写值 NEW.type 将在触发器完成时插入表中。

lx0bsm1f

lx0bsm1f2#

错误消息是相当不言自明的。一 TRIGGER 禁止修改触发触发器的表。
mysql参考手册中记录了该限制
https://dev.mysql.com/doc/refman/5.7/en/stored-program-restrictions.html
存储的函数或触发器不能修改已被调用该函数或触发器的语句(用于读取或写入)使用的表。
在一个 BEFORE INSERT 以及 BEFORE UPDATE 触发器时,我们可以通过引用将值赋给正在插入或更新的行的列 NEW.column_name 例如

-- check if value assigned to `col` is valid
 IF NEW.col IN ('cash','checking','credit') THEN
    -- it is valid, so do nothing 
    DO 0;
 ELSE
   -- value isn't valid, so override the provided value
   SET NEW.col = 'cash';
 END IF;

空的 BEGIN END 区块优先于 DO 0; 声明。另外,一定要预料到 NULL 并确保正确处理这些值(请注意,“不等于”比较 NULL 会回来的 NULL ,不是真的或假的。)

-- check if value assigned to `col` is valid
 IF NEW.col IN ('cash','checking','credit') THEN
    -- it is valid, so do nothing 
    BEGIN END;
 ELSE
   -- value isn't valid, so override the provided value
   SET NEW.col = 'cash';
 END IF;

相关问题