MYSQL Trigger不允许更新同一个表

时间:2013-12-06 20:21:23

标签: mysql stored-procedures

我有一个表提交,我想更新字段消息中具有类似哈希的所有记录。 但是,它不允许我更新使用触发器的同一个表。 我尝试在过程中放置​​一个事务,但后来我得到一个错误,即函数或触发器中不允许隐式或显式提交。 (即使它在程序中。)

我对mysql程序不是很熟悉,我希望你能解决这个问题。

这是将更新所有其他记录的程序

CREATE PROCEDURE `update_commits_by_message_id` (IN messageId VARCHAR(255))
BEGIN

   DECLARE approvedAt DATETIME;
   DECLARE approvedByUserId INT(11);

   SELECT approved_at, approved_by_user_id 
   INTO approvedAt, approvedByUserId 
   FROM commits 
   WHERE message LIKE CONCAT('%', messageId, '%')
   AND approved_at IS NOT NULL
   LIMIT 1; 

   UPDATE commits
   SET 
   approved_by_user_id = approvedByUserId,
   approved_at = approvedAt
   WHERE message LIKE CONCAT('%', messageId, '%')
   AND approved_at IS NULL;

END//

这是触发器,它使用消息id

调用上面的过程
CREATE TRIGGER `commit_equalizer` 
BEFORE INSERT
ON commits 

FOR EACH ROW
BEGIN
   DECLARE changeId VARCHAR(250);

   SET changeId = SPLIT_STR(NEW.message, 'Change-Id: ', 1);

   CALL update_commits_by_message_id(changeId);

END//

DELIMITER ;

1 个答案:

答案 0 :(得分:1)

MySql不允许这样做。

请参阅文档:http://dev.mysql.com/doc/refman/5.7/en/faqs-triggers.html#qandaitem-B-5-1-9

  

B.5.9:可以触发访问表吗?

     

触发器可以访问自己的表中的旧数据和新数据。触发器也可以影响其他表,但是不允许通过调用函数或触发器的语句修改已经使用的表(用于读取或写入)