MYSQL触发器不允许更新同一个表

标签 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 ;

最佳答案

MySql 不允许这样做。

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

B.5.9: Can triggers access tables?

A trigger can access both old and new data in its own table. A trigger can also affect other tables,
but it is not permitted to modify a table that is already being used (for reading or writing) by the statement that invoked the function or trigger

关于MYSQL触发器不允许更新同一个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20432874/

相关文章:

c# - 使用 Entity Framework 从存储过程中检索表数据

c# - 如何向存储过程提供参数

php - 存储过程和mysql

postgresql - 在函数内插入失败,返回 "query has no destination for result data"

php - 循环遍历动态 mysql 数据数组时遇到问题

java - 玩java mysql应用程序在长时间空闲时间后断开连接(可能是8小时后)

java - 如何将现有数据库导入 netbeans

php - 验证用户名是否已存在于 PHP 和 MYSQL 中?

mysql - 从 MySQL 中的日期时间字段中选择特定的日期时间

sql-server - select语句中的变量表名