MySQL上的更新触发器不工作
我正在尝试创建一个触发器来更新Name='test\u user'所在的整个表。 以下是我到目前为止得到的信息: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
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;