所以我编辑了我的代码 我在另一个触发器中遇到此问题,但这次甚至更改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 ;
答案 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=...
吗?应该可以规范化数据,以便触发器中没有循环引用。事实上,根本不需要触发器。