【问题标题】:Secuencial triggers mysql is already used by statatementSecuencial 触发器 mysql 已被语句使用
【发布时间】:2017-02-23 21:09:19
【问题描述】:

我正在 mysql 中开发一个项目,我无法在 2 个触发器之间进行操作,我想做的是

1) 创建一个触发器,在一个表中插入值后更新另一个表的数据,工作

2) 创建一个触发器,更新上述表后,删除引爆第一个触发器的行,不起作用

我搜索了文档、示例、教程、goolge,当然还有网站的不同帖子,但我没有找到任何可以指导我或帮助解决我的问题的东西:(

暂时我有这个

1)

CREATE TRIGGER update1 BEFORE INSERT ON table1
FOR EACH ROW 
UPDATE table2 SET table2.value = table2.value + 
NEW.value WHERE ac_id = NEW.acc_id

2)

CREATE TRIGGER `delete` AFTER UPDATE ON table2
FOR EACH ROW DELETE FROM table1 WHERE table1.acco_id =
NEW.acc_id

单独两个都可以,但是如果我在 table1 中插入,则会出现以下消息

无法更新存储函数/触发器中的表“table1”,因为它已被调用此存储函数/触发器的语句使用。

对不起,我的英语不好,任何帮助将不胜感激,在此先感谢

【问题讨论】:

  • 我不确定这里有没有可以回答的问题。如果问题是“这是预期的行为吗?”,那么答案是“是的,这是一个有据可查的限制”。如果问题是“有解决方法吗?”,答案是“不在单个 SQL INSERT 语句的上下文中,不,没有解决方法。”可以使用两个(或更多)单独的语句来执行操作。
  • @spencer7593 最大的限制是数据来自我无权访问的网页,这就是为什么无法实现存储过程的原因,按照你说的,是不是可以通过其他方式实现吗?
  • 您的INSERT 语句会触发两个触发器。他们在两个表之间执行操作。 MySQL 会阻止您这样做,因为它可能导致无限循环。斯宾塞说的是,你不能使用 1 个查询(启动整个事情的 INSERT 一个)来做到这一点。你无法修复它,因为没有任何东西被破坏,MySQL 阻止你开枪。你需要想出一种不同的方法。

标签: mysql database triggers


【解决方案1】:

观察到的错误信息:

ERROR 2442 (HY000) Can't update table '%s' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

是预期的行为。问题中显示的触发器违反了记录在案的限制:

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

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


为了将重点放在问题中显示的特定触发器上,在插入到 table1 的触发器的上下文中,不可能从 table1 中删除行。没有解决此限制的方法。

“解决这个问题”意味着从当前的设计中退后一步,提出一个不同的设计来实现目标。

【讨论】:

    猜你喜欢
    • 2010-12-07
    • 1970-01-01
    • 2015-01-10
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    相关资源
    最近更新 更多