微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

MYSQL ERROR 1422:存储函数或触发器中不允许显式或隐式提交

如何解决MYSQL ERROR 1422:存储函数或触发器中不允许显式或隐式提交

我正在尝试创建一个 before_insert 触发器,以防两列为空以不允许数据插入。我尝试应用的想法是在插入时在两列上创建 notnull 约束,然后删除该约束。

我对 sql 不太了解,我尝试使用以下代码

CREATE DEFINER = CURRENT_USER TRIGGER `db_autoescola`.`contas_recebers_BEFORE_INSERT` BEFORE INSERT ON `contas_recebers` FOR EACH ROW
BEGIN
    IF NEW.id_recepcionista IS NULL and NEW.id_instrutor IS NULL
    THEN ALTER TABLE contas_recebers MODIFY id_recepcionista INT NOT NULL;
         ALTER TABLE contas_recebers MODIFY id_instrutor INT NOT NULL;
    END IF;
END

但是,在尝试应用此触发器时,我遇到了以下错误,我无法确定需要什么来纠正它。

Operation Failed: There was an error while applying the sql script to the database.
Executing:
DROP TRIGGER IF EXISTS `db_autoescola`.`contas_recebers_BEFORE_INSERT`;

DELIMITER $$
USE `db_autoescola`$$
CREATE DEFINER = CURRENT_USER TRIGGER `db_autoescola`.`contas_recebers_BEFORE_INSERT` BEFORE INSERT ON `contas_recebers` FOR EACH ROW
BEGIN
    IF NEW.id_recepcionista IS NULL and NEW.id_instrutor IS NULL
    THEN ALTER TABLE contas_recebers MODIFY id_recepcionista INT NOT NULL;
         ALTER TABLE contas_recebers MODIFY id_instrutor INT NOT NULL;
    END IF;
END$$
DELIMITER ;

ERROR 1422: Explicit or implicit commit is not allowed in stored function or trigger.
sql Statement:
CREATE DEFINER = CURRENT_USER TRIGGER `db_autoescola`.`contas_recebers_BEFORE_INSERT` BEFORE INSERT ON `contas_recebers` FOR EACH ROW
BEGIN
    IF NEW.id_recepcionista IS NULL and NEW.id_instrutor IS NULL
    THEN ALTER TABLE contas_recebers MODIFY id_recepcionista INT NOT NULL;
         ALTER TABLE contas_recebers MODIFY id_instrutor INT NOT NULL;
    END IF;
END

解决方法

DDL(数据定义语言)的使用

 ALTER TABLE 

产生隐式提交,这在触发器中是不允许的。您无法更改数据结构运行时,必须在操作数据之前执行这些操作。

,

感谢@scaisEdge,考虑到这一点,我想出了一个解决方案:

我没有尝试更改表,而是创建了一个 notnull 列来检查两者何时为空,这样我就会将空值传递给它,如果为真,否则为任何值。这样我就可以在我的应用程序中收到异常并按照我想要的方式处理它。

代码:

CREATE DEFINER = CURRENT_USER TRIGGER `contas_recebers_BEFORE_INSERT` BEFORE INSERT ON `contas_recebers` FOR EACH ROW BEGIN
    IF NEW.id_recepcionista IS NULL and NEW.id_instrutor IS NULL
    THEN SET NEW.ids_null = null;
    else SET NEW.ids_null = TRUE;
    END IF;
END

我认为这甚至可能是一个愚蠢的问题,解决方案也不是最好的,但这是我设法解决它的方式,也许它会帮助其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?