2014-04-08 77 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;