0

コードを編集したので、別のトリガーでこの問題が発生しましたが、今回は WHERE 句を変更しても役に立ちません

DELIMITER $$

CREATE TRIGGER pic_album_change  AFTER UPDATE  ON pictures
  FOR EACH ROW BEGIN
    UPDATE albums SET counter = counter + 1 WHERE albums.id = NEW.album_id;
    UPDATE albums SET counter = counter - 1 WHERE albums.id = OLD.album_id;


END $$
DELIMITER ;

エラー :

    <p>Error Number: 1442</p><p>Can't update table 'pictures' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

このトリガーの写真テーブルに変更が見られません

これら2つのテーブルを含む別のトリガーがあります

DELIMITER $$
CREATE TRIGGER  album_change
  AFTER UPDATE
  ON albums
  FOR EACH ROW
BEGIN
  UPDATE pictures
     SET

      level = NEW.level


    WHERE
   pictures.album_id =  NEW.id   ;


END $$
DELIMITER ;
4

1 に答える 1

0

あなたのWHERE句は間違った方法です。

WHERE albums.id = NEW.album_id 

増加しますalbums.counter(おそらく、それは各アルバムの写真の数です)。

テーブルの結合は可換ではないため、これは重要です — 結合の方向が重要です。albumsここでは、 の行の値に基づいて更新するレコードを見つける必要がありますpictures

この場合、あいまいさはまったくありませんが、SQL は結合に関する規則に従う必要があります。


2 番目のトリガーの問題は、MySQL が継続的な更新サイクルを妨げていることです。が更新されたときに更新されるトリガーpic_album_changeがあります。そして、更新時に更新されるトリガーがあります。それらのトリガーは互いにトリガーします。albumspicturesalbum_changepicturesalbums

データベースの設計を変更する必要があるように思えます。albums.counterそのデータが で見つかるとき、本当に必要SELECT count(*) FROM pictures WHERE album_id=...ですか? トリガーに循環参照がないように、データを正規化できる必要があります。実際、トリガーはまったく必要ない場合があります。

于 2012-07-08T09:52:19.713 に答える