有什么更有效的方式编写此代码? MySQL数据库

问题描述

重写此MysqL触发器的更好方法是什么?最好使用空表或其他任何想法。实施时会是什么样子?

DELIMITER // 如果存在TR_BORROWING,则触发触发器 //

创建触发器TR_BORROWING 在为每行借入之前插入

BEGIN
    -- setting session variable for member status -- 
    
    SET @MemStat =(SELECT m.MemberStatus 
                   FROM member m 
                   WHERE NEW.MemberID = m.MemberID);
    
    -- checking member status condition 1 -- 
    
    IF(@MemberStatus = 'REGULAR') THEN
        SET @OOS =(SELECT h.OnLoan 
                   FROM holding h 
                   WHERE NEW.BranchID = h.BranchID  
                   AND NEW.BookID = h.BookID );
     
        SET @INS =(SELECT h.InStock 
                       FROM holding h 
                       WHERE NEW.BranchID = h.BranchID 
                       AND NEW.BookID = h.BookID);
    END IF;  
    
    -- Checking there are books in stock condition 2 --                    
    
    IF(@INS > @OOS) THEN
        SET @bookCount =(SELECT count(b.BookID) 
                         FROM member m JOIN borrowedby bb on m.MemberID = bb.MemberID 
                         WHERE bb.DateReturned = NULL 
                         AND NEW.MemberID = m.MemberID 
                         AND NEW.BookID = bb.BookID);
    END IF;
    
    -- Checking member has no copies of that book on loan and membership doesnt expire before due date condition 3 and 4 -- 
    
    IF(@bookCount = 0) THEN
            SET @newDate = datediff(NEW.ReturnDueDate,NEW.DateBorrowed)/7;
            SET @memID = (SELECT m.MemberID
                          FROM member m 
                          WHERE m.MemberID = bb.MemberID 
                          AND NEW.ReturnDueDate < m.MemberExpDate);
    END IF;        
    -- all conditions passed,inserting --         
            
    IF(@memID IS NOT NULL AND @newDate <= 3) THEN
        INSERT INTO `borrowedby` (`BranchID`,`BookID`,`MemberID`,`DateBorrowed`,`DateReturned`,`ReturnDueDate`) 
        VALUES (NEW.BranchID,NEW.BookID,NEW.MemberID,NEW.DateBorrowed,NEW.DateReturned,NEW.ReturnDueDate);
        UPDATE holding 
        SET OnLoan = OnLoan + 1
        WHERE NEW.BookID = BookID   
        AND NEW.BranchID = BranchID;
    END IF;
    

END; //

解决方法

最初,您可以测试替换它

SELECT @OOS =(SELECT h.OnLoan 
           FROM holding h 
           WHERE NEW.BranchID = h.BranchID  
           AND NEW.BookID = h.BookID );

SET @INS =(SELECT h.InStock 
               FROM holding h 
               WHERE NEW.BranchID = h.BranchID 
               AND NEW.BookID = h.BookID);

SELECT @OOS = h.OnLoan,@INS = h.InStock
           FROM holding h 
           WHERE NEW.BranchID = h.BranchID  
           AND NEW.BookID = h.BookID ;