2014-04-08 72 views
1

我试图创建一个触发器更新整个表,其中Name ='test_user'。 这是我走到这一步:更新触发MySQL不工作

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?

回答

1

这是触发器的奇怪用法,但是如果您真的希望发生这种情况,也许可以通过触发器调用函数。

或者,为什么不尝试使用INSTEAD OF触发器,并仅在用户名等于test_user时用SQL_TEST替换UserName?我猜这就是你想要实现的目标?

例如:

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