2016-04-04 72 views
1

我希望MySQL觸發器自動執行某些操作,而不是將它放在應用程序邏輯中。如何讓這個SQL觸發器不返回結果而工作?

該方法大致是這樣的。

CREATE TRIGGER InsertAction AFTER INSERT 
ON UserAction 
FOR EACH ROW CALL CreateAutomaticResponse(...); 

其中採用

CREATE PROCEDURE CreateAutomaticResponse (...) 
    INSERT INTO SomeTable (foo, bar) 
    VALUES 
    (
      SELECT x FROM SomeTable ... 
      ... 
    ) 

現在,這將創建一個錯誤

ERROR 1093 (HY000) at line 1675: You can't specify target table 'SomeTable' for update in FROM clause 

我認爲解決的辦法是做這樣的事情

SELECT @tmp := x FROM SomeTable ... 
INSERT INTO SomeTable (foo, bar) VALUES (@tmp, ...) 

的麻煩,這是我然後得到

ERROR 1415 (0A000) at line 1666: Not allowed to return a result set from a trigger 

它似乎是導致此行的SELECT @tmp := ...行。

就我而言,儘管有SELECT,但這個過程並沒有返回任何東西,因爲它只是選擇一個臨時變量。

我可以告訴MySQL認爲程序沒有返回任何東西嗎?或以其他方式解決此問題

+0

你試過'INSERT INTO sometable(FOO,吧) SELECT X,Y FROM sometable' – artm

+0

'你不能修改您在SELECT part'使用相同的表。你在'INSERT'語句中顯然是這樣做的。解決方法是不要使用嵌套的子查詢並在不同的部分執行它......在另一個說明中,第二個錯誤「不允許從觸發器返回結果集」顯然是因爲你不能執行'SELECT'語句觸發。如果你想設置變量,使用'SELECT INTO' ...另外,我想說的很好的問題! – Codexer

回答

0

INSERT INTO ... SELECT工作。