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

时间:2019-02-16 21:09:49

标签: mysql sql triggers database-trigger mysql-5.7

我在mysql 5.7数据库上有一张表格,其中包含运动员,其中包括特定运动中他们的平均,最大,平均时间。我还有另一个表格,列出了根据这些值进行的计算统计信息。

我设法使用存储过程进行了第二次计算。我将运动员的名字用作存储过程的输入参数。

因此,当在第一个表格中插入运动员(具有其平均/最小/最大时间)或更新他/她的值并运行存储过程时,后者将更新统计信息表。

我的问题是如何使用触发器达到相同的结果?

我想在每次插入或更新第一个表时更新整个表都是可行/容易的。在每个方面,更高效的方式是有效的:

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"动态地传递给触发器,以避免更新整个统计表?

2 个答案:

答案 0 :(得分:0)

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

话虽如此,trigger可以使用NEW.athlete_nameOLD.athlete_name(以必需的为准)从正在插入/更新/删除的记录中选取用户的名字,然后使用该名字来调用存储过程:

  

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

     

在INSERT触发器中,只能使用NEW.col_name。没有老   行。在DELETE触发器中,只能使用OLD.col_name。没有   新行。在UPDATE触发器中,可以使用OLD.col_name来引用   行更新前的列和要引用的NEW.col_name   行更新后的列。

     

以OLD命名的列是只读的。您可以参考它(如果您有   SELECT权限),但不能对其进行修改。您可以参考专栏   如果您具有SELECT权限,则以NEW命名。在之前   触发器,您也可以使用SET NEW.col_name = value更改其值   如果您具有UPDATE特权。这意味着您可以使用   触发以修改要插入新行或用于   更新一行。 (这样的SET语句在AFTER触发器中无效。   因为行更改将已经发生。)

答案 1 :(得分:0)

您可以创建每次在父表(运动员)上插入或更新后触发的触发器。在每个触发器中,您可以访问刚刚创建或更改的记录上的运动名列的值,然后使用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;