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

add column after insert with trigger, error 1422

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

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.

感谢您的帮助。

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

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

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

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

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

Stack 上有几个关于在触发器中动态添加列的问题。特别是从新开发人员到 SQL,他们认为 "on the fly" 添加一列是有意义的。它从来没有。它通常表明设计理念不佳。就像,这是一年中新的一周,让我们添加一个新的专栏。

实时触发器不适合 DDL。