mysql - 运行多个查询,其中全部成功或全部失败

标签 mysql sql-update sql-insert atomic

我需要将 2 行更新到 2 个不同的表中,然后将新行插入到另一个不同的表中,必须这样做,以便它们都成功或失败。 (我认为这个词是原子的?)。我进行了一些搜索,但似乎只能找到与对一个表进行多次插入或更新相关的问题。

下面是我需要运行的 3 个查询:

UPDATE submission SET status='a' WHERE idgreg = 119 AND status='p' AND userid = 126;

UPDATE greg SET iscomplete=1 WHERE idgreg = 119;

INSERT INTO completion (idperson, idgreg, datecompleted, idsubmission, mediaid, description, 
privatestatus, contenttype, totalamount)  
SELECT s.idperson, s.idgreg, s.datesubmitted, s.idsubmission, COALESCE(s.youtubeid, s.contentid) AS mediaidid, g.description, g.privatestatus, 
g.contenttype, COALESCE(SUM(amount),0) AS totalamount 
FROM submission s 
INNER JOIN greg g on s.idgreg = g.idgreg 
INNER JOIN contribution c on s.idgreg = c.idgreg 
WHERE s.idsubmission = 36 AND c.ispaid = 1;

最佳答案

您应该将查询包装在 MySQL 事务 中,以确保它们以原子方式执行。但首先,声明错误处理程序,它将在发生错误时ROLLBACK所有更改:

CREATE PROCEDURE runYourQueries()

BEGIN

DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK;
DECLARE EXIT HANDLER FOR SQLWARNING ROLLBACK;

START TRANSACTION;

UPDATE submission SET status='a' WHERE idgreg = 119 AND status='p' AND userid = 126;

UPDATE greg SET iscomplete=1 WHERE idgreg = 119;

INSERT INTO completion (idperson, idgreg, datecompleted, idsubmission, mediaid, description,
    privatestatus, contenttype, totalamount)  
SELECT s.idperson, s.idgreg, s.datesubmitted, s.idsubmission,
    COALESCE(s.youtubeid, s.contentid) AS mediaidid, g.description, g.privatestatus,
    g.contenttype, COALESCE(SUM(amount),0) AS totalamount 
FROM submission s 
INNER JOIN greg g on s.idgreg = g.idgreg 
INNER JOIN contribution c on s.idgreg = c.idgreg 
WHERE s.idsubmission = 36 AND c.ispaid = 1;

COMMIT;

END

关于mysql - 运行多个查询,其中全部成功或全部失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36170403/

相关文章:

mysql - 如何使用Sum和Group by在SQL中建立两个表之间的关系

mysql - SQL变量未在go客户端的选择查询中更新

php - MySQL - 使用一个查询更新一列的值

java - 如果值不在 ENUM 中,则更改插入值

sql - 如何使用两个表中的数据建立关系?

html - 列依赖于 mysql 中的其他列

php - 匹配两个用户的网站 - 确认连接

php - 更新特定列等于其他表

sql - 根据插入的 ID 和 SQL 中的另一个非源列更新记录

sql-server - SQL Server 2008插入失败报告