【问题标题】:How to insert multiple records in one stored procedure and rollback if one fails - mysql如何在一个存储过程中插入多条记录并在一个失败时回滚 - mysql
【发布时间】:2022-08-12 04:11:58
【问题描述】:

我有一个为该特定部分的学生创建Assesments 和createAssesmentMarks 的存储过程。

每当我插入单个记录时,它都会成功执行,但是当我尝试将多个记录插入一个时,因为“子查询返回多于一行”错误并将数据存储在 assesmentsTable 中,但不是 AssesmentMarksTable

所以我的问题是:

  1. 如何在一次执行中插入多条记录?
  2. 如果无法防止数据存储不一致,我该如何回滚?
           DELIMITER $$
        
            CREATE PROCEDURE createAssesment(IN name VARCHAR(100), maxMarks INT, classId INT, sectionId INT , subjectId INT)
        
            BEGIN
        
            INSERT INTO assesments (name , maxMarks , classId , sectionId , subjectId) VALUES (name , maxMarks, classId , sectionId , subjectId);
            
            INSERT INTO assesmentMarks  (assesmentId , scoredMarks , studentId) VALUES (SELECT LAST_INSERT_ID() FROM assesments) , (scoredMarks) ,(SELECT stud.studentId FROM students stud WHERE stud.sectionId = sectionId); 
        
         
            END $$
        
            DELIMITER ;
    
  • 提示:多插入+事务块。
  • 嘿,谢谢你介意提供一些进一步的指示吗?
  • 这些关键字将直接引导您找到所需的答案。
  • 谢谢兄弟,提示帮助了我很多,我会发布答案

标签: mysql database


【解决方案1】:

感谢@tadman 的提示

经过一些研究,我发现这些可以作为上述两个问题的答案:-

DELIMITER $$
CREATE PROCEDURE createAssesment(IN name VARCHAR(100), maxMarks INT, classId INT, sectionId INT , subjectId INT)
BEGIN
 DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
        ROLLBACK;  -- rollback any changes made in the transaction
    END;
SET autocommit = 0;
START TRANSACTION ;
INSERT INTO assesments (name , maxMarks , classId , sectionId , subjectId) VALUES (name , maxMarks , classId , sectionId , subjectId);
INSERT INTO assesmentMarks  (assesmentId  , studentId )
SELECT LAST_INSERT_ID() , stud.studentId  FROM assesments a CROSS JOIN Students stud WHERE stud.sectionId = sectionId;
COMMIT ;
SET autocommit = 1;
END $$
DELIMITER ;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    • 2012-07-10
    相关资源
    最近更新 更多