首页 > 解决方案 > MySQL - 3 个更新需要在过程中逐个运行

问题描述

我必须在一个过程中运行 3 次更新。当我在 php 中一一调用它们时,我的 3 个单独的更新运行良好,但我想让它们重新组合以仅执行一个调用。我的程序是

create
    definer = root@localhost procedure UpdateScorePredictionParticipant(IN predPts int(10), IN predId int(10), IN partId int(10))
BEGIN
  UPDATE predictions
  SET pred_pts = @predPts
  WHERE pred_game_id = @predId and participant_id = @partId;

  UPDATE ranking
  SET pts_wildcard = (SELECT sum(pred_pts)
  FROM predictions
  INNER JOIN games g on predictions.pred_game_id = g.id
  WHERE predictions.participant_id = @partId)
  WHERE participant_id = @partId;

  UPDATE ranking
  SET total = (pts_wildcard+pts_conference+pts_division+pts_pred_sb+pts_sb)
    WHERE participant_id = @partId;

END;

我怎么能在同一个调用中逐个执行这 3 个更新。

谢谢,

标签: mysqlstored-procedures

解决方案


当您更新 3 个不同的表时,您将需要执行三个单独的更新。然而,如果你把它们放在一个过程中,你只需要从 PHP 代码中调用这个过程。

要修复过程代码,请@从使用的参数名称中删除 。

为参数添加前缀也是一个好习惯,这样它们就不会与列名混淆。

您可以做的最后一件事是在过程中使用事务,以便所有更新都完成,或者如果其中一些更新失败,则没有一个更新完成。这保证了操作的原子性。

create procedure UpdateScorePredictionParticipant(
in_predPts int, 
in_predId int, 
in_partId int
)
BEGIN

START TRANSACTION;

UPDATE predictions
SET pred_pts = in_predPts
WHERE pred_game_id = in_predId and participant_id = in_partId;

UPDATE ranking
SET pts_wildcard = (
  SELECT sum(pred_pts)
  FROM predictions
    INNER JOIN games g on predictions.pred_game_id = g.id
  WHERE predictions.participant_id = in_partId
)
WHERE participant_id = in_partId;

UPDATE ranking
SET total = (pts_wildcard+pts_conference+pts_division+pts_pred_sb+pts_sb)
WHERE participant_id = in_partId;

COMMIT;

END

推荐阅读