我在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"
动态地传递给触发器,以避免更新整个统计表?
答案 0 :(得分:0)
您不能将任何参数传递给触发器,并且insert
语句也不支持where
子句。
话虽如此,trigger可以使用NEW.athlete_name
或OLD.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;