表“书”:
bookid | title
1 | Java
2 | MySQL
3 | Zen
表“BestPage”:
pageid | bookid | isbestpage
1 | 1 | 0
2 | 1 | 0
3 | 1 | 1
4 | 2 | 0
5 | 2 | 1
6 | 2 | 0
所以有些书可能有“最佳页面”,但只有一个。 现在我可能需要一个beforeupdate触发器,所以当我用pageid 2更新行,并设置isbestpage = 1时, 然后所有其他页面,但只有这本书将isbestpage设置为0。
类似的东西:
for each row
begin
if old.isbestpage = 1 and -- here I want to tell that **only for the current book** !
then
set new.isbestpage = 0
或类似的东西。
也就是说,如果我将页面标记为最佳页面,则本书中的所有其他页面都应设置为不是最佳页面
感谢。
答案 0 :(得分:1)
不幸的是你不能在MySql触发器中做到这一点
根据 E.1. Restrictions on Stored Programs
在存储的函数或触发器中,不允许修改a 已经被使用(用于读或写)的表 调用函数或触发器的语句。
尽管减轻了一些痛苦,你可以做的是创建一个像这样的存储过程
DELIMITER $$
CREATE PROCEDURE sp_update_bestpage(IN pid INT)
BEGIN
UPDATE bestpage p JOIN
bestpage p1 ON p.bookid = p1.bookid
SET p.isbestpage = 0
WHERE p1.pageid = pid AND p.pageid <> pid;
UPDATE bestpage
SET isbestpage = 1
WHERE pageid = pid;
END $$
DELIMITER ;
然后使用它
CALL sp_update_bestpage(2);
<强> SQLFiddle 强>