Mysql 说:#1422 - 存储函数或触发器中不允许显式或隐式提交

Posted

技术标签:

【中文标题】Mysql 说:#1422 - 存储函数或触发器中不允许显式或隐式提交【英文标题】:Mysql said: #1422 - Explicit or implicit commit is not allowed in stored function or trigger 【发布时间】:2014-11-28 22:50:43 【问题描述】:

在下面的代码中,我正在尝试创建一个触发器,如果​​ Web 应用程序的用户没有上传带有属于“incidentreport”表的表单的图像,则该触发器会插入“incidentimg”表 ID 以及图像路径,我只收到错误“mysql 说:#1422 - 存储函数或触发器中不允许显式或隐式提交

DROP TRIGGER IF EXISTS `insertImage`;
CREATE TRIGGER `insertImage` AFTER INSERT ON `incidentreport` 
FOR EACH ROW 
BEGIN 
    IF(SELECT incidentimg.incidentImgId FROM incidentimg 
       LEFT JOIN incidentreport ON incidentimg.imgs_incidentReportId = incidentreport.incidentReportId 
       WHERE incidentimg.incidentImgId IS NULL) 
       THEN INSERT INTO incidentimg(incidentImgId, imgUrl)values(NEW.incidentReportId, 'images/no-image.png'); 
    END IF; 
END
;

这里是正在使用的表格

谁能帮助我解决这个问题

【问题讨论】:

【参考方案1】:

我终于让代码工作了。现在代码将检查“incidentimg”表是否具有“incidentreport”表具有的所有“incidentReportId”,如果没有,则将插入“incidentreport”表中最后插入的 id 以及默认图像路径插入后进入“事件”表。

CREATE TRIGGER insertImage AFTER INSERT ON incidentreport
FOR EACH ROW    
BEGIN
    IF(SELECT incidentreport.incidentReportId 
        FROM incidentreport
        LEFT JOIN incidentimg ON incidentreport.incidentReportId = incidentimg.imgs_incidentReportId
        WHERE incidentimg.imgs_incidentReportId IS NULL)
        THEN INSERT INTO incidentimg(imgs_incidentReportId, imgUrl) VALUES(NEW.incidentReportId, 'images/no-image.png');
    END IF;
END

【讨论】:

【参考方案2】:

我不太确定,但我猜这可能是因为IF .. THEN 条件INSERT。尝试使用EXISTS 修改您的INSERT 语句

DROP TRIGGER IF EXISTS `insertImage`;
CREATE TRIGGER `insertImage` AFTER INSERT ON `incidentreport` 
FOR EACH ROW 
BEGIN 
INSERT INTO incidentimg(incidentImgId, imgUrl)
SELECT NEW.incidentReportId, 'images/no-image.png'
FROM DUAL WHERE EXISTS (
SELECT 1 FROM incidentimg 
       LEFT JOIN incidentreport 
ON incidentimg.imgs_incidentReportId = incidentreport.incidentReportId 
WHERE incidentimg.incidentImgId IS NULL
)  
END;

【讨论】:

您是否仍然遇到同样的错误?我相信这是 SELECT 语句;你能解释一下你想用那个 SELECT 语句做什么吗? 在网络应用程序中,用户应该完成一个步骤向导,其中表单的第一部分属于“事件报告”报告,下一部分用于上传图像(事件表),但是用户不必上传图片。因此,使用 select 语句,我试图通过检查该条目是否为空来检查在填充“incidentreport”表之后是否有任何数据插入到“incidentimg”表中......希望这很清楚@Rahul

以上是关于Mysql 说:#1422 - 存储函数或触发器中不允许显式或隐式提交的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 说:#1336 - 存储函数或触发器中不允许使用动态 SQL

mysql视图,存储过程,函数,事务,触发器,以及动态执行sql

MySql 错误:无法更新存储函数/触发器中的表,因为它已被调用此存储函数/触发器的语句使用

如何在 MYSQL 中编写可以从触发器和存储函数调用的信号函数?

如何在 MYSQL 中编写可以从触发器和存储函数调用的信号函数?

mysql数据库之 存储引擎事务视图触发器存储过程函数流程控制