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

MYSQL错误1422:存储函数或触发器中不允许显式或隐式提交,mysql,Mysql,我试图在两列为空的情况下生成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.i

我试图在两列为空的情况下生成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(数据定义语言)作为


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

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

我没有试图更改表,而是创建了一个notnull列来检查这两个列是否为null,这样我将在为true时将null值传递给它,否则将传递任何值。这样,我可以在我的应用程序中接收一个异常,并以我想要的方式处理它

代码:


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

您不能在触发器中更改表。若你们想捕捉空值并拒绝它们,那个么就使用信号
 ALTER TABLE 
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