我正在尝试了解有关触发器的更多信息,并且我在 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);
错误:
Syntax error near 'insert into NewEMCtestPLAN(ProjectNumber,Applicant,ModelName,PONumber,AccountExe' at line 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
错误:
Error in query (1054): Unknown column 'NEW.ProjectNumber' in 'field list'
但是当我在第一次插入中使用new.projectnumber时,并没有出现这个错误。
第二个错误:
Error in query (1064): Syntax error near 'END' at line 1
最佳答案
具有多个语句的触发器主体需要用 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
语句是单个.. 好吧.. 语句。语句由..好吧..分隔符分隔。因此,在原始查询中,触发器定义以第一个分隔符 (;
) 结尾:
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 (...);
第二个插入可能是有效语句,但在触发器定义之外。但是,我期望出现不同的错误消息,例如:未知表(别名)'NEW'
,因为NEW
在触发器外部未知。
现在,如果我们将分隔符更改为 //
,create 语句将在第一次出现 //
后结束,因此我们可以使用 ;
在触发器主体中而不终止 CREATE 语句。
通常使用//
或$$
作为分隔符。您可以尝试其他方法,但它在 (My)SQL 中不应该有任何意义。例如 |
是 bit operator .
关于mysql - 第二个插入在我的触发器中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48550645/