我正在尝试创建一个更新整个表的触发器,其中Name ='test_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_user?
的行答案 0 :(得分:1)
这是一个奇怪的触发器使用,但是如果你真的希望这种情况发生,那么从触发器调用一个函数就行了。
或者,为什么不尝试使用INSTEAD OF触发器并将UserName替换为SQL_TEST,只要它等于test_user?我猜你正在努力实现的目标是什么?
例如:
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;
答案 1 :(得分:0)
你的意图是什么? Imho看起来你试图修复其他地方发生的错误。无论如何,这不适用于mysql,因为mysql无法处理触发器中同一个表的更新。
请参阅:http://forums.mysql.com/read.php?99,122354,249709#msg-249709
答案 2 :(得分:0)
最好先更新表格以替换现有值。然后创建一个这样的触发器来过滤新值:
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;
答案 3 :(得分:0)
我不确定您是否要重置new
用户名数据
但如果是,请将触发器更改为BEFORE TRIGGER
。
试试这个:
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;