2013-05-08 84 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