更新MySQL上的触发器无法正常工作

时间:2014-04-08 09:17:32

标签: mysql triggers sql-update

我正在尝试创建一个更新整个表的触发器,其中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?

的行

4 个答案:

答案 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;