我想在触发器中向表中添加新列但它不起作用
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.
感谢您的帮助。
答案 0 :(得分:3)
存储的函数和触发器不允许事务和提交(这将是显式提交),也不允许DDL操作(这将是隐式提交)。
DML - 数据操作语言。检索和设置数据的操作。这些应该是你在触发器中的重点。
DDL - 数据定义语言。更改表结构的操作。这些永远不应该触发。
因此,您的ALTER TABLE
是DDL,不允许使用。
此外,DDL例程耗时。 ALTER TABLE
可能需要几分钟或几小时才能运行。即使守护程序允许它,它也无法通过同行评审来正确使用高性能RDBMS。事先设置您的架构,然后使用它。除了更多的分阶段数据迁移或转换之外,不要动态添加列。
Stack上有几个关于在触发器中动态添加列的问题。特别是从新的开发人员到SQL,认为他们“在运行中”添加一个列是有道理的。它永远不会。它通常是一个糟糕的设计理念的指标。就像,这是一年中的新一周,让我们添加一个新专栏。
实时触发器不适用于DDL。