mysql - 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 个更新。
谢谢,
解决方案
当您更新 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
推荐阅读
- python - 如何在仅显示数据时禁用表单的字段,但在使用新表单输入数据时启用
- css - 灯塔标记的这个神秘 CSS 是什么?
- citations - Mendeley - 我如何找到与特定引用相关联的文件夹?
- javascript - 如何在 Angular2+ 中为 *ngFor 元素设置锚点?
- python-3.x - 为什么我的蜘蛛没有爬取所有元素?
- actions-on-google - 将已发布的代理版本恢复回对话流
- c++11 - 如何通过引用将 time_t 传递给函数
- javascript - 在 Safari 浏览器(macbook)的 javascript 中找不到变量
- c++ - 如何以链式方式在两个容器上构建迭代器
- python - 使用 fiona 和 geopandas 打开一些 gdb 文件时出错