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 语句应用于表是一种常见的做法。那么你只需要检查一次。
每次插入一行数据时都检查缺失的列,这可能会发生数百万次,是一种不必要且浪费的操作。
我正在尝试创建一个触发器,将数据插入 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 语句应用于表是一种常见的做法。那么你只需要检查一次。
每次插入一行数据时都检查缺失的列,这可能会发生数百万次,是一种不必要且浪费的操作。