【问题标题】:Whats a more efficient way of writing this code? MYSQL [closed]编写此代码的更有效方法是什么? MYSQL [关闭]
【发布时间】:2021-02-14 15:53:34
【问题描述】:

有什么更好的方法来重写这个 MySQL 触发器?使用空表或任何其他想法会更好吗?实施后会是什么样子?

分隔符 // 如果存在则删除触发器 TR_BORROWING //

创建触发器 TR_BORROWING BEFORE INSERT ON Boredby FOR EACH ROW

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;
    

结束; //

【问题讨论】:

  • 请解释您尝试实现的逻辑。提供有关您希望触发器执行的操作的示例数据和所需结果。

标签: mysql sql performance processing-efficiency


【解决方案1】:

最初,您可以测试替换它

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 ;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 2010-11-22
    • 2022-11-23
    相关资源
    最近更新 更多