2012-07-08 66 views
0

所以我已经编辑我的代码 我在另一个触发这个问题,但这个时间甚至可更改WHERE子句不利于MySQL的触发器不能更新表:已经通过调用该触发器的语句使用

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

http://stackoverflow.com/questions/9227382/cant-update-table-that-trigger-is-executed-on-in-after-insert – Samson 2012-07-08 09:32:15

+2

我认为你的WHERE子句是错误的方法回合。 'WHERE albums.id = NEW.album.id'会导致'albums.counter'增加(大概是每张专辑中的图片数量)。 – 2012-07-08 09:33:37

+0

@radashk感谢您的链接,但正如我所说我的触发器没有附在同一张桌子上 – max 2012-07-08 09:39:03

回答

0

您的WHERE子句是错误的方法。

WHERE albums.id = NEW.album_id 

会导致albums.counter将递增(大概这就是图片的每张专辑的数量)。

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

虽然在这种情况下没有任何含糊之处,SQL需要遵循关于连接的规则。


第二个触发器的问题是MySQL阻止了连续的更新周期。当更新pictures时,您有触发pic_album_change,其更新albums。当你更新albums时,你有一个触发器album_change,它会更新pictures。这些触发器将触发对方。

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

+0

thanx安德鲁抱歉打扰你,但我有他在另一个触发器相同的问题。我不知道可能是什么问题。我没有编辑我的代码 – max 2012-07-08 10:36:13

+0

@max我不认为这是整个编辑旧问题的原因,因为这会使答案无效。事实上,其他触发因素可能会影响这个人的行为。你有什么其他触发'图片'? – 2012-07-08 11:56:36

+0

对不起,你对我不应该编辑这个问题。但我发现另一个触发器,涉及这两个表我认为我必须以某种方式合并或重写它们,所以它们不会相互冲突 – max 2012-07-08 16:03:23