【问题标题】:Mysql triggers Create errorMysql 触发器创建错误
【发布时间】:2013-07-16 23:29:40
【问题描述】:

这是我的创建触发器。我希望在插入 vhftofass 时执行此查询(UPDATE vhf_msg_rx SET msg_text="";),这意味着它使此表为空 vhf_msg_rx。但是当我在插入查询后编写该查询时会出错(无法更新表'vhf_msg_rx'存储函数/触发器,因为它已被调用此存储函数/触发器的语句使用。)请帮助我该怎么做

CREATE
    /*!50017 DEFINER = 'root'@'localhost' */

    TRIGGER `VHFtoFASS` AFTER UPDATE ON `vhf_msg_rx` 
    FOR EACH ROW BEGIN
    INSERT INTO  vhftofass  SELECT NULL,msg_text,NOW(),0 FROM vhf_msg_rx WHERE  msg_text<>"";
    END;
$$

【问题讨论】:

  • 如果您在每次更新到vhf_msg_rx 时都插入vhftofass,为什么需要在each的后一个表中插入每个非空msg_text > 场合?如果NEW.msg_text 现在不为空,那么仅将新更新的记录插入vhftofass 就足够了?这将避免必须从锁定的表中读取。
  • 如您所见,在 MySQL 中,您无法在分配给该表的更新触发器内修改表 - 大概是为了避免不得不处理这可能暗示的递归。在此处描述您要执行的操作,可能有一种使用 BEFORE 触发器的方法。
  • 如果表 vhf_msg_rx 表有新数据,它将插入表 vhftofass。并使 vhf_msg_rx 为空,以便我确保此消息在 vhf_msg_rx 中有我无法阅读的新消息。一次两条消息可能相同。如果我不做 null 我如何理解这条消息是新的或旧的。请任何解决方案给我。谢谢

标签: mysql triggers


【解决方案1】:

我不完全清楚您要做什么,但您似乎想将一个表的修改行复制到另一个表中,但只保留某些字段。例如,您可以通过在 FOR EACH ROW 循环内使用 NEW.columnname 引用插入的记录来做到这一点

CREATE TRIGGER `VHFtoFASS` AFTER UPDATE ON `vhf_msg_rx` 
FOR EACH ROW BEGIN
    INSERT INTO  vhftofass VALUES(NULL,NEW.msg_text,NOW(), 0);
END;

请注意,这只会处理更新 - 您需要一个 INSERT 触发器来捕获新行。

【讨论】:

  • 我理解你的代码。没关系并插入 vhftofass 。但是如果我愿意,当插入 vhftofass 表时,vhf_msg_rx 表将被截断。我该怎么做?
  • 您可以在 vhftofass 上尝试插入后触发器,但我认为 vhf_msg_rx 可能已被锁定。如果这不起作用,您可以使用计划的事件每隔几分钟自动执行一次表维护。
  • 感谢 Paul Dixon 的帮助。我想使用触发器。
猜你喜欢
  • 2014-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-25
  • 2016-02-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多