1

表“书”:

bookid | title
1      | Java
2      | MySQL
3      | Zen

表“最佳页面”:

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

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

4

1 回答 1

1

不幸的是,您不能在 MySql 触发器中执行此操作

根据E.1。存储程序的限制 在
存储函数或触发器中,不允许修改调用函数或触发器的语句已经使用(用于读取或写入)的表。

你可以做些什么来减轻一些痛苦是创建一个像这样的存储过程

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

于 2013-05-08T19:30:33.817 回答