第二个插入在我的触发器中不起作用

时间:2018-01-31 20:10:04

标签: mysql sql

我正在尝试了解有关触发器的更多信息,并在MySQL中编写了一个简单的SQL代码。 此代码将使用一个插入,但在添加第二个插入时将导致错误。

我认为我编写的代码不会编译第二个插入。

我会感谢任何帮助

代码:

create trigger MasterInputTRG
after insert on MasterInput
for each row
   insert into NewEMCtestPLAN(ProjectNumber,Manufacture,ModelName,`PO Number`,AccountExecutive,AENotes) values(NEW.ProjectNumber,NEW.Applicant,NEW.ModelName,NEW.PONumber,NEW.AccountExecutive,NEW.AENotes);
   insert into NewRF(ProjectNumber,Applicant,ModelName,PONumber,AccountExecutive,AENotes) values(NEW.ProjectNumber,NEW.Applicant,NEW.ModelName,NEW.PONumber,NEW.AccountExecutive,NEW.AENotes);

错误:

  

附近'插入的语法错误   NewEMCtestPLAN(ProjectNumber,申请人MODELNAME,采购单号码,AccountExe'   在第5行

更新: 我得到了一个答案,我在这里添加了其他错误代码。:

不起作用的第二段代码:

create trigger MasterInputTRG
after insert on MasterInput
for each row
BEGIN
   insert into NewEMCtestPLAN(ProjectNumber,Manufacture,ModelName,`PO Number`,AccountExecutive,AENotes) values(NEW.ProjectNumber,NEW.Applicant,NEW.ModelName,NEW.PONumber,NEW.AccountExecutive,NEW.AENotes);
   insert into NewRF(ProjectNumber,Applicant,ModelName,PONumber,AccountExecutive,AENotes) values(NEW.ProjectNumber,NEW.Applicant,NEW.ModelName,NEW.PONumber,NEW.AccountExecutive,NEW.AENotes);
END

错误:

  

查询错误(1054):未知列' NEW.ProjectNumber'在'领域   列表'

但是当我在第一次插入时使用new.projectnumber时,没有出现这个错误。

第二个错误:

  

查询错误(1064):' END'附近的语法错误在第1行

2 个答案:

答案 0 :(得分:0)

您应该在触发器中添加Begin End

create trigger MasterInputTRG
after insert on MasterInput
for each row
   BEGIN
   insert into NewEMCtestPLAN(ProjectNumber,Manufacture,ModelName,`PO Number`,AccountExecutive,AENotes) values(NEW.ProjectNumber,NEW.Applicant,NEW.ModelName,NEW.PONumber,NEW.AccountExecutive,NEW.AENotes);
   insert into NewRF(ProjectNumber,Applicant,ModelName,PONumber,AccountExecutive,AENotes) values(NEW.ProjectNumber,NEW.Applicant,NEW.ModelName,NEW.PONumber,NEW.AccountExecutive,NEW.AENotes);
   END

答案 1 :(得分:0)

具有多个语句的触发器主体需要被BEGINEND包围。但是(根据您的客户端)您可能需要更改分隔符:

delimiter //

create trigger MasterInputTRG
after insert on MasterInput
for each row
begin
   insert into NewEMCtestPLAN (...) values (...);
   insert into NewRF (...) values (...);
end //

delimiter ;

这同样适用于存储过程和函数。

请注意,CREATE TRIGGER语句是单个.. well .. 语句。语句由..井......分隔分隔符分隔。因此,在原始查询中,触发器定义以第一个分隔符(;)结束:

create trigger MasterInputTRG
after insert on MasterInput
for each row
   insert into NewEMCtestPLAN (...) values (...); -- trigger ends here
-- anything else is outside the trigger
   insert into NewRF (...) values (...);

第二个插入可以是有效语句,但在触发器定义之外。但是我会期望有一条不同的错误消息,例如:unknown table (alias) 'NEW',因为NEW在触发器之外是未知的。

现在,如果我们将分隔符更改为//,则create语句在第一次出现//后结束,因此我们可以在触发器主体中使用;而不终止CREATE语句。

通常//$$用于分隔符。你可以尝试别的东西,但它在(我的)SQL中没有任何意义。例如,|bit operator