【问题标题】:add column after insert with trigger, error 1422使用触发器插入后添加列,错误 1422
【发布时间】:2016-09-11 01:39:42
【问题描述】:

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

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.

感谢您的帮助。

【问题讨论】:

    标签: mysql mariadb


    【解决方案1】:

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

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

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

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

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

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

    实时触发器不适用于 DDL。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-06
      • 2013-11-06
      • 1970-01-01
      • 2016-09-13
      • 1970-01-01
      • 2016-01-27
      相关资源
      最近更新 更多