2016-09-11 107 views
0

我想新列在触发器添加到表后添加列,但它不工作插入与触发,错误1422

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. 

感谢任何帮助。

回答

3

存储函数和触发器不允许交易,并承诺(这将是明确的提交)也不允许DDL操作(这是隐含提交)。

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

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

所以,你ALTER TABLE是DDL,它是不允许的。

此外,DDL程序是耗时的。 ALTER TABLE可能需要几分钟或几小时才能运行。即使守护进程允许它,也不能在同行评审中幸免于正确使用高性能RDBMS。手动设置您的模式,并使用它。除了更多的分阶段数据迁移或转换之外,不要动态添加列。

已经有在栈中的几个问题,关于触发器在飞行中添加列。特别是从新开发人员到SQL,他们认为他们的“即时”添加列是有道理的。它永远不会。它通常是一个糟糕的设计理念的指标。比如,这是一年中的新一周,让我们添加一个新的专栏。

直播触发对DDL的地方。