我正在尝试了解有关触发器的更多信息,并在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行
答案 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)
具有多个语句的触发器主体需要被BEGIN
和END
包围。但是(根据您的客户端)您可能需要更改分隔符:
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。