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

MySQL如何将所有新/旧触发器数据放入临时表并在过程中使用?,mysql,stored-procedures,triggers,procedure,temp-tables,Mysql,Stored Procedures,Triggers,Procedure,Temp Tables,如何将新/旧数据放入没有文件名的临时表中。 我尝试过创建触发器,过程如下,但失败了: 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 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$$

您可以看到每一行都显示

每行
后面的语句定义了每次触发器激活时要执行的语句,受触发语句影响的每行执行一次。-(增加重点)

因此,您建议为使用触发器插入到表中的每一行创建一个新的临时表,以某种方式使用
new
*
访问所有列以插入到该表中,然后调用一个存储过程,并通过从临时表中选择两列插入到另一个表中,您可能知道这两列位于原始表中。在某些情况下,临时表当然需要离开,因为如果在一个查询或一个会话中向表中插入了多行,那么您将尝试创建一个临时表,其名称与会话已经拥有的名称相同

我从来没有在触发器或文档中遇到过旧的.*或新的.*catchalls,而且无论如何,除了可能避免键入两个列名或在不更新此触发器的情况下更改存储过程跟踪的内容之外,根本不清楚您要实现什么

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

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

备选案文1:

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

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


CREATE PROCEDURE `after_insert_action`(in new_name TEXT, in new_detail TEXT)
# you may want to use more appropriate datatypes instead of TEXT
# but this should work as written as long as those columns are no larger than TEXT
BEGIN
    INSERT INTO `slave` (`name`,`detail`) VALUES (new_name, new_detail);
END$$

您可以看到每一行都显示

每行
后面的语句定义了每次触发器激活时要执行的语句,受触发语句影响的每行执行一次。-(增加重点)

因此,您建议为使用触发器插入到表中的每一行创建一个新的临时表,以某种方式使用
new
*
访问所有列以插入到该表中,然后调用一个存储过程,并通过从临时表中选择两列插入到另一个表中,您可能知道这两列位于原始表中。在某些情况下,临时表当然需要离开,因为如果在一个查询或一个会话中向表中插入了多行,那么您将尝试创建一个临时表,其名称与会话已经拥有的名称相同

我从来没有在触发器或文档中遇到过旧的.*或新的.*catchalls,而且无论如何,除了可能避免键入两个列名或在不更新此触发器的情况下更改存储过程跟踪的内容之外,根本不清楚您要实现什么

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

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

备选案文1:

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

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


CREATE PROCEDURE `after_insert_action`(in new_name TEXT, in new_detail TEXT)
# you may want to use more appropriate datatypes instead of TEXT
# but this should work as written as long as those columns are no larger than TEXT
BEGIN
    INSERT INTO `slave` (`name`,`detail`) VALUES (new_name, new_detail);
END$$

嗯,谢谢你的回答。我记不起我问了什么,但我的问题——毫无意义。创建临时文件。表中的每一行为一个-“嗯,谢谢你的回答。我记不起我问了什么,但我的问题-毫无意义。要在每行创建一个临时表。--”