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.

我在此触发器中的图片表上没有看到任何变化

我有另一个涉及这两个表的触发器

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增加(大概是每个相册中的图片数量)。

这很重要,因为表上的连接不是可交换的——连接的方向很重要。这里需要根据 inalbums中行的值找到要更新的记录pictures

虽然在这种情况下实际上没有任何歧义,但 SQL 需要遵循有关连接的规则。


第二个触发器的问题是 MySQL 阻止了连续的更新循环。您有一个触发器pic_album_change,它会在更新albumspictures更新。而且您有一个触发器,该触发器album_change在更新picturesalbums更新。这些触发器将相互触发。

在我看来,数据库设计可能需要更改。你真的需要albums.counter什么时候可以找到这些数据SELECT count(*) FROM pictures WHERE album_id=...吗?应该可以对数据进行规范化,以便触发器中没有循环引用。事实上,触发器可能根本不需要。

于 2012-07-08T09:52:19.713 回答