1

表「本」:

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" がある場合がありますが、1 つだけです。ここで、おそらく 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);

SQLフィドル

于 2013-05-08T19:30:33.817 に答える