2011-12-02 63 views
1

在创建下面的触发器之后,当我尝试执行更新时,出现错误(在代码后详述)。无论我走哪条路,我似乎都无法更新表格。我是否必须创建一个新表格并在其中添加一列用于更新,或者有解决方法吗? This page说:“在存储的函数或触发器中,不允许修改调用该函数或触发器的语句已在使用(用于读取或写入)的表。”但是,NEW和OLD关键字有什么意义?我只是不正确地使用它们吗?mySQL触发器无法更新调用触发器的语句已在使用的表

表:像册

列:重量,改性剂,评级

触发:updateRating

CREATE TRIGGER updateRating 
BEFORE UPDATE ON gallery 
FOR EACH ROW 
UPDATE gallery SET rating= sum(NEW.weight * NEW.modifier) 

CREATE TRIGGER updateRating 
AFTER UPDATE ON gallery 
FOR EACH ROW 
UPDATE gallery SET rating= sum(weight * modifier) 

SQL查询:编辑

UPDATE`acs`.`gallery` SET`weight` = '6' WHERE`gallery`.`id` = 1 LIMIT 1

MySQL表示:文件

#1442 - 无法更新在存储函数/触发器中的表'库',因为它已经被调用该存储函数/触发器的语句使用。

回答

5

正确,错误表示您不能修改gallery表,因为触发器是使用此表定义的。还有就是要更新值一种可能的方式,它是一个BEFORE UPDATE触发器,这里是一个例子 -

CREATE TRIGGER updateRating 
BEFORE UPDATE 
ON gallery 
FOR EACH ROW 
BEGIN 
    SET NEW.rating= NEW.weight * NEW.modifier; -- You may update a NEW value. 
END 

最后,请允许我问一个问题。你为什么要使用触发器来修改rating?我想说,你可以在SELECT语句中即时计算rating

+0

不得不删除BEGIN/END关键字,因为只有一个语句要运行(目前),但是这很有效。感谢您澄清我可以改变NEW.rating,但不仅仅是直接在桌上进行评分。你是对的,我可以使用一个即时的SELECT语句。尽管如此,我还是想在其他方面加入其他内容,所以这就是为什么我想弄明白。 – SimonDever