mySQL触发器无法更新表:已被调用触发器的语句使用

时间:2012-07-08 09:27:50

标签: mysql triggers

所以我编辑了我的代码 我在另一个触发器中遇到此问题,但这次甚至更改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 ;

1 个答案:

答案 0 :(得分:0)

你的WHERE条款是错误的。

WHERE albums.id = NEW.album_id 

会导致albums.counter递增(可能是每张专辑中的图片数量)。

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

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


第二个触发器的问题是MySQL阻止了连续的更新周期。您有一个触发器pic_album_change,在albums更新时会更新pictures。并且您有一个触发器album_change,在pictures更新时会更新albums。那些触发器将相互触发。

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