mysql update trigger:更新“some”其他行

时间:2013-05-08 18:18:14

标签: 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

所以有些书可能有“最佳页面”,但只有一个。 现在我可能需要一个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

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

1 个答案:

答案 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