【问题标题】:Can a MySQL trigger be associated to more than one table or by all tables?MySQL 触发器可以关联到多个表或所有表吗?
【发布时间】:2013-07-02 22:53:23
【问题描述】:

我已经创建了这个触发器来将一个值计算值插入到表中的一个字段中,以防用户忘记自己放置数据:

DELIMITER //
CREATE TRIGGER OnNewTableRegistry BEFORE INSERT ON eduardo8_plataforma.tabela
FOR EACH ROW
BEGIN
    IF NEW.ut = null THEN
        SET NEW.ut = GetUT('tabela');
    ELSEIF NEW.ut = '' THEN
        SET NEW.ut = GetUT('tabela');
    END IF;
END;
//
DELIMITER ;

但我需要对该数据库中的每个表执行相同的操作。是否可以对所有表使用相同的触发器,如果​​是,我们如何在指定了tabela 的第 6 行和第 8 行中获取触发使用它的表的名称?

我需要这样的东西:

DELIMITER //
CREATE TRIGGER OnNewTableRegistry BEFORE INSERT ON (* as _TableName)
FOR EACH ROW
BEGIN
    IF NEW._TableName.ut = null THEN
        SET NEW._TableName.ut = GetUT(_TableName);
    ELSEIF NEW._TableName.ut = '' THEN
        SET NEW._TableName.ut = GetUT(_TableName);
    END IF;
END;
//
DELIMITER ;

【问题讨论】:

  • 很明显,您是希望一个触发器更新数据库中的多个表,还是希望在数据库中的多个表上重复使用同一个触发器?
  • 我需要在数据库的任何表中重用相同的触发器;-)

标签: mysql triggers


【解决方案1】:

没有。 syntax 没有提供。

允许它是没有意义的,因为 NEW 关键字必须引用特定的行定义。如果您有两个表具有相同的行定义,则应将它们制成一个表,另一列表示差异。

【讨论】:

  • 嗨波西米亚人,如果我来自特定数据库的所有表都有一个列 created_at DATETIME 并且我想在插入时将它们设置为 NOW() 怎么办?我可以有一些架构级触发器来实现这一点吗?
  • @user2745266 你不需要触发器。标准sql就足够了。将该列定义为created_at datetime not null default now() 并在插入语句insert into mytable (...) values (...) 中省略该列(在第一组括号内列出所有其他列),当前时间将自动插入。
  • 您好,非常感谢您的回复。但是默认的 now() 给了我一个错误:“'created_at' 的默认值无效”....
  • @user2745266 您正在尝试的列的完整定义是什么?
  • @user2745266 我检查了几个地方,你是对的:不能将函数用于默认值。触发器是唯一的方法。祝你好运。
猜你喜欢
  • 2010-12-23
  • 2014-09-16
  • 1970-01-01
  • 2014-06-24
  • 1970-01-01
  • 2021-07-15
  • 2020-08-20
  • 2013-11-29
  • 1970-01-01
相关资源
最近更新 更多