2016-04-04 71 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工作。