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

MYSQL Error Code: 1422. Explicit or implicit commit is not allowed in stored function or trigger

我正在尝试创建一个触发器,将数据插入 ATRACCIONES table 的“contador”列, 首先检查该列是否存在,如果不存在则创建它。

但我收到以下错误,我不知道如何修复:

Error Code: 1422. Explicit or implicit commit is not allowed in stored function or trigger.

USE CIRCO;
DROP TRIGGER IF EXISTS atracciones_numAtracc_INSERT;
DELIMITER $$
CREATE TRIGGER atracciones_numAtracc_INSERT AFTER INSERT ON ATRACCION_DIA FOR EACH ROW
BEGIN
    DECLARE v_col varchar(20);

    SELECT COLUMN_NAME
    INTO v_col
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE COLUMN_NAME = 'contador' AND TABLE_NAME = 'ATRACCIONES';

    IF (v_col IS NULL) THEN
        ALTER TABLE ATRACCIONES ADD `contador` int NOT NULL DEFAULT 0; 
    END IF;
        
    UPDATE ATRACCIONES
    SET contador = contador + 1
    WHERE nombre = NEW.nombre_atraccion;

END $$
DELIMITER ;

只需进行更新并保持触发器简单。不要尝试为不存在的列签入触发器。

CREATE TRIGGER atracciones_numAtracc_INSERT AFTER INSERT ON ATRACCION_DIA FOR EACH ROW
BEGIN
    UPDATE ATRACCIONES
    SET contador = contador + 1
    WHERE nombre = NEW.nombre_atraccion;
END $$

编写触发器时假设您需要的列确实存在。

在插入数据之前,请确保表确实包含所需的列。在部署新版本的应用程序时,将 ALTER TABLE 语句应用于表是一种常见的做法。那么你只需要检查一次。

每次插入一行数据时都检查缺失的列,这可能会发生数百万次,是一种不必要且浪费的操作。