我正在尝试使用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
我不知道它做了什么,或者它为什么会存在,但之前它就在那里。
答案 0 :(得分:6)
您在上面显示的触发器很好。
编辑:当您在phpMyAdmin的GUI中创建触发器时,您只需要在定义窗格中输入触发器的主体,换句话说就是部件BEGIN...END
。
这是因为phpMyAdmin会尝试变聪明,并根据您输入的其他元素(名称,表格,时间,事件)为您编写触发器标题。
这是在phpMyAdmin中定义触发器的正确方法:
如果在正文中写入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
。JOIN
语法而不是SQL-89“逗号样式”连接。UPDATE
与联接一起使用,而不是EXISTS
与相关子查询一起使用。UPDATE
语句。