2013-05-08 86 views
1

表 “书”:mysql的触发更新:更新 “一些” 其他行

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 

所以有些书可能有一个 “bestpage”,但只有一个。 现在,我可能会需要一个更新前触发所以当我的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 

或类似的东西。
也就是说,如果我将页面标记为bestpage,则应该将本书中的所有其他页面设置为不是最佳页面。
谢谢。

回答

1

不幸的是你不能这样做,在MySQL触发

根据E.1. Restrictions on Stored Programs
在存储函数或触发器,它不允许修改已被使用 表(用于读取或写入)由调用该函数或触发器的 语句。

,你能做些什么,虽然以减轻一些痛苦是创建一个存储过程,这样

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