无法从另一个存储例程中创建TRIGGER - 什么是另一个“存储例程”?

时间:2013-11-18 18:14:34

标签: mysql triggers phpmyadmin

我正在尝试使用PhpMyAdmin在MySQL中创建一个触发器。

CREATE TRIGGER Update_Last_Transit_Status AFTER INSERT ON Delivery 
FOR EACH ROW
BEGIN
UPDATE Transportation SET Status="Dispatched" WHERE 
EXISTS (SELECT * FROM Transit, Route WHERE Transit.ID=Route.Transit_ID and
        Route.Delivery_ID=Delivery.ID and 
        Transit.Transportation_ID=Transportation.ID) and
        Status="In Branch"
END

它说:

MySQL said: #1303 - Can't create a TRIGGER from within another stored routine

我知道之前已经解决了这个错误,但这根本不是我的意图。

这里的“另一个存储例程”在哪里?

我不打算出现错误信息。

修改 没有定义其他触发器。但是有一个预定义的程序:

begin
        select user() as first_col;
        select user() as first_col, now() as second_col;
        select user() as first_col, now() as second_col, now() as third_col;
        end

我不知道它做了什么,或者它为什么会存在,但之前它就在那里。

1 个答案:

答案 0 :(得分:6)

您在上面显示的触发器很好。

编辑:当您在phpMyAdmin的GUI中创建触发器时,您只需要在定义窗格中输入触发器的主体,换句话说就是部件BEGIN...END

这是因为phpMyAdmin会尝试变聪明,并根据您输入的其他元素(名称,表格,时间,事件)为您编写触发器标题。

这是在phpMyAdmin中定义触发器的正确​​方法:

enter image description here

如果在正文中写入CREATE TRIGGER...标题,则会混淆MySQL,因为它会看到CREATE TRIGGER... CREATE TRIGGER... BEGIN...END。这使得MySQL认为您正在定义一个触发器,其第一个语句是CREATE TRIGGER


作为原始问题的一个侧面问题,我建议对触发器的主体进行一些更改:

CREATE TRIGGER Update_Last_Transit_Status AFTER INSERT ON Delivery 
FOR EACH ROW
BEGIN
  UPDATE Transportation
    INNER JOIN Transit ON Transit.Transportation_ID = Transportation.ID
    INNER JOIN Route ON Transit.ID = Route.Transit_ID
  SET Transportation.Status = 'Dispatched'
  WHERE Route.Delivery_ID = NEW.ID
    AND Transportation.Status = 'In Branch';
END

变化:

  • 参考NEW.ID而不是Delivery.ID
  • 使用SQL-92 JOIN语法而不是SQL-89“逗号样式”连接。
  • 将多表UPDATE与联接一起使用,而不是EXISTS与相关子查询一起使用。
  • 对字符串使用单引号而不是双引号。
  • 使用分号终止UPDATE语句。