我有一张关于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"
传递给触发器,以避免更新整个统计表?
您不能将任何参数传递给触发器,insert
语句也不支持where
子句。
话虽如此,trigger可以使用NEW.athlete_name
或OLD.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触发器中没有效果,因为行已经发生了变化。)
您可以创建在父表(运动员)上每次插入或更新后触发的触发器。在每个触发器中,您可以在刚创建或更改的记录上访问列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;