【发布时间】: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