MySQL上的更新触发器不工作

MySQL上的更新触发器不工作,mysql,triggers,sql-update,Mysql,Triggers,Sql Update,我正在尝试创建一个触发器来更新Name='test\u user'所在的整个表。 以下是我到目前为止得到的信息: CREATE TRIGGER users.insert_log AFTER INSERT ON users.logBook FOR EACH ROW UPDATE users.logBook SET UserName = 'SQL_TEST' WHERE UserName = 'test_user'; 它毫无问题地触发了我的触发器。 但是当插入时,我得到了这个错误: ERROR

我正在尝试创建一个触发器来更新Name='test\u user'所在的整个表。 以下是我到目前为止得到的信息:

CREATE TRIGGER users.insert_log 
AFTER INSERT ON users.logBook
FOR EACH ROW
UPDATE users.logBook
SET UserName = 'SQL_TEST'
WHERE
UserName = 'test_user';
它毫无问题地触发了我的触发器。 但是当插入时,我得到了这个错误:

ERROR 1442 (HY000): Can't update table 'logBook' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

如何更新UserName=test\u user所在的行?

这是一种奇怪的触发器用法,但如果您真的想这样做,也许可以从触发器调用函数

或者,为什么不尝试一个INSTEAD OF触发器,并且仅当用户名等于TEST_user时,才将其替换为SQL_TEST?我猜这就是你想要实现的

例如:

CREATE TRIGGER users.insert_log 
BEFORE INSERT ON users.logBook
FOR EACH ROW
BEGIN
IF NEW.UserName = 'test_user' THEN
SET NEW.UserName = 'SQL_TEST';
END IF;
END;

你的意图是什么?我觉得你好像在试图修复发生在其他地方的错误。无论如何,这不适用于mysql,因为mysql不能在触发器中处理同一个表上的更新


请参阅:

最好先更新表以替换现有值。然后创建这样的触发器来过滤新值:

CREATE TRIGGER users.insert_log BEFORE INSERT ON users.logBook
  FOR EACH ROW
BEGIN
    IF NEW.UserName = 'test_user' THEN
        SET NEW.UserName = 'SQL_TEST';
    END IF;
END;

我不确定是否要重置
新的
用户名数据。
但如果是,请将触发器更改为触发器之前的

试试这个:

CREATE TRIGGER users.insert_log 
  BEFORE INSERT ON users.logBook
  FOR EACH ROW
    SET NEW.UserName = case when NEW.username = 'test_user' then 'SQL_TEST' 
                            else NEW.username
                       end;