问题描述
重写此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 ;