MySQL:如何将参数传递给触发器

问题描述 投票:1回答:2

我有一张关于mysql 5.7 db的桌子,其中包含运动员在特定运动中的平均,最大,平均时间。我有另一个表,列出了一些基于这些值的计算统计数据。

我设法使用存储过程完成第二次计算。我使用运动员姓名作为存储过程的输入参数。

因此,当在第一个表中,插入运动员(以他/她的平均/最小/最大时间)或他/她的值被更新并且我运行存储过程,之后更新统计表。

我的问题是如何用触发器实现相同的结果?

我想在每个插入或更新第一个表时更新整个表是可行/容易的。什么会更有效的表现,将在每个:

INSERT into table1 values (..) where athlete_name="John Do"

(...)

ON DUPLICATE KEY UPDATE (...)

以伪代码形式运行触发器:

INSERT into statistics_table values (..) where athlete_name="John Do"

ON DUPLICATE KEY UPDATE (...)

如何动态地将athlete_name="John Do"传递给触发器,以避免更新整个统计表?

mysql sql triggers database-trigger mysql-5.7
2个回答
0
投票

您不能将任何参数传递给触发器,insert语句也不支持where子句。

话虽如此,trigger可以使用NEW.athlete_nameOLD.athlete_name(以需要者为准)从插入/更新/删除的记录中获取用户名,并使用它来调用存储过程:

在触发器主体中,OLD和NEW关键字使您可以访问受触发器影响的行中的列。 OLD和NEW是触发器的MySQL扩展;它们不区分大小写。

在INSERT触发器中,只能使用NEW.col_name;没有旧排。在DELETE触发器中,只能使用OLD.col_name;没有新的行。在UPDATE触发器中,您可以使用OLD.col_name在更新行之前引用行的列,使用NEW.col_name在更新行之后引用该行的列。

以OLD命名的列是只读的。您可以引用它(如果您具有SELECT权限),但不能修改它。如果您具有SELECT权限,则可以引用以NEW命名的列。在BEFORE触发器中,如果您具有UPDATE权限,还可以使用SET NEW.col_name = value更改其值。这意味着您可以使用触发器来修改要插入新行或用于更新行的值。 (这样的SET语句在AFTER触发器中没有效果,因为行已经发生了变化。)


0
投票

您可以创建在父表(运动员)上每次插入或更新后触发的触发器。在每个触发器中,您可以在刚创建或更改的记录上访问列Athle_name的值,然后使用CALL()调用存储过程。

以下是这种INSERT触发器的代码示例:

CREATE TRIGGER athletes_upd AFTER INSERT ON athletes 
FOR EACH ROW
BEGIN
    CALL my_procedure(NEW.athlete_name);
END;

UPDATE触发器:

CREATE TRIGGER athletes_upd AFTER UPDATE ON athletes 
FOR EACH ROW
BEGIN
    CALL my_procedure(NEW.athlete_name);  -- or maybe OLD.athlete_name ?
END;
© www.soinside.com 2019 - 2024. All rights reserved.