使用触发器插入后添加列,错误 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。
我想在触发器中向 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。