插入后使用触发器添加列,错误1422

时间:2016-09-11 01:39:43

标签: mysql mariadb

我想在触发器中向表中添加新列但它不起作用

DELIMITER //
DROP TRIGGER IF EXISTS add_dep_oncall//
CREATE TRIGGER add_dep_oncall
AFTER INSERT ON `department` 
FOR EACH ROW 
BEGIN

DECLARE col_name varchar(30);
SET col_name = NEW.department_name;

ALTER TABLE `oncall` ADD COLUMN col_name VARCHAR(255) DEFAULT NULL;

END//

我使用mariadb。

在上面运行SQL代码后,错误是

Explicit or implicit commit is not allowed in stored function or trigger.

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

存储的函数和触发器不允许事务和提交(这将是显式提交),也不允许DDL操作(这将是隐式提交)。

DML - 数据操作语言。检索和设置数据的操作。这些应该是你在触发器中的重点。

DDL - 数据定义语言。更改表结构的操作。这些永远不应该触发。

因此,您的ALTER TABLE是DDL,不允许使用。

此外,DDL例程耗时。 ALTER TABLE可能需要几分钟或几小时才能运行。即使守护程序允许它,它也无法通过同行评审来正确使用高性能RDBMS。事先设置您的架构,然后使用它。除了更多的分阶段数据迁移或转换之外,不要动态添加列。

Stack上有几个关于在触发器中动态添加列的问题。特别是从新的开发人员到SQL,认为他们“在运行中”添加一个列是有道理的。它永远不会。它通常是一个糟糕的设计理念的指标。就像,这是一年中的新一周,让我们添加一个新专栏。

实时触发器不适用于DDL。