MySQL如何将所有NEW / OLD触发器数据放入临时表并在程序中使用?

时间:2013-02-22 04:29:42

标签: mysql stored-procedures triggers procedure temp-tables

如何将NEW / OLD数据放入没有字段名称的临时表中。 我尝试过创建触发器,这样的程序但它失败了:


CREATE TRIGGER `after_insert` AFTER INSERT
ON `master`
FOR EACH ROW BEGIN
    CREATE TEMPORARY TABLE after_insert_trigger_temp_table ENGINE=MEMORY 
    AS (SELECT NEW.*);
    CALL after_insert_action();
END$$


CREATE PROCEDURE `after_insert_action`()
BEGIN
    INSERT INTO `slave` (`name`,`detail`)
    SELECT `name`,`detail` FROM after_insert_trigger_temp_table;
END$$

1 个答案:

答案 0 :(得分:3)

您会看到FOR EACH ROW ...

所在的部分
  

FOR EACH ROW之后的语句定义了每次触发器激活时要执行的语句,触发语句对每行发生一次。 - http://dev.mysql.com/doc/refman/5.5/en/trigger-syntax.html (强调添加)

因此,您建议为每个行创建一个新的临时表,并使用触发器插入到表中,以某种方式使用NEW访问所有列。{{1}用于插入到该表中,然后调用存储过程,并通过从该临时表中选择两个列来插入到不同的表中,这些列可能是您知道的在原始表中。在某些时候,临时表当然需要消失,因为如果在一个查询或一个会话中向表中插入多于一行,那么您将尝试创建一个与一个名称相同的临时表已经拥有你的会话。

我从来没有遇到过OLD。*或NEW。*在触发器或文档中发现的问题,无论如何,除了可能避免键入两个列名称或者能够在不更新此触发器的情况下更改您使用存储过程跟踪的内容。

但是,您需要牢记触发器的一个关键设计因素是它们应该尽可能少地尽可能少地执行,因为如果您不遵守此规则,它们很有可能成为性能问题。

我想到了几种替代方法,因为临时表根据问题中的细节没有意义:

选项1:

*

选项2:

CREATE TRIGGER `after_insert` AFTER INSERT ON `master` FOR EACH ROW 
BEGIN
    INSERT INTO `slave` (`name`,`detail`) VALUES (NEW.`name`,NEW.`detail`);
END $$