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

标签 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);

错误:

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

最佳答案

具有多个语句的触发器主体需要用 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 语句是单个.. 好吧.. 语句。语句由..好吧..分隔符分隔。因此,在原始查询中,触发器定义以第一个分隔符 (;) 结尾:

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/

相关文章:

mysql - 如何通过 sql 连接而不是 csv 在 neo4j 中导入数据?

mysql - 按排名对用户排序时排除排名

mysql - 在数据库中设置名称的最佳做法是什么?

php - 如何在查询运行之前删除查询中的字符

php - 大表最快的MySQL行排名

涉及 'not exists' 的 MYSQL 查询

php - Null 和 False 之间的区别

php - 在不同日期更新2条记录?

mysql - 如何在 InnoDB 中不回收 auto_increment ID

sql - 为什么在PostgreSQL中创建生成的列时出现错误?