MYSQL触发器给出错误

时间:2018-04-29 01:09:00

标签: mysql triggers mariadb

帐户表:enter image description here

MYSQL终端:enter image description here

我触发了Accounts表格,该表格将响应任何更新或插入数据库,这将为帐户类型提供除信用,支票或现金之外的任何其他价值。

我尝试实施触发器(已编译),但每当我尝试添加不是现金,信用卡和支票的东西时,它都会给我一个错误。什么可能导致/修复此错误?

2 个答案:

答案 0 :(得分:0)

不是执行insert,而是通过设置OLD的属性,将列的NEW值替换为您想要的新值:

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

触发器完成后,NEW.type中存储的覆盖值将插入到表格中。

答案 1 :(得分:0)

错误消息相当自我解释。禁止TRIGGER修改触发触发器的表。

该限制记录在MySQL参考手册

https://dev.mysql.com/doc/refman/5.7/en/stored-program-restrictions.html

  

存储的函数或触发器不能通过调用函数或触发器的语句修改已经使用(用于读取或写入)的表。

BEFORE INSERTBEFORE 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值,并确保对其进行适当处理。 (请注意,&#34;不等于&#34;与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;