【问题标题】:MySQL trigger INSERT all NEW columnsMySQL 触发器 INSERT 所有新列
【发布时间】:2016-02-16 23:23:39
【问题描述】:

是否可以触发插入新行的所有列?基本上,我想在另一个表中复制新插入的记录,但是必须指定所有列。

类似

DELIMITER $$

CREATE TRIGGER TestTrigger
AFTER INSERT
   ON Table1 FOR EACH ROW

BEGIN
    INSERT INTO `Table2` SELECT * FROM NEW;
END$$
DELIMITER ;

但是,每当我尝试在 Table1 中插入新行时,这都会返回 Table 'Database.NEW' doesn't exist

From MySQL documentation:

在触发器主体中,您可以使用别名 OLD 和 NEW 来引用主题表(与触发器关联的表)中的列。 OLD.col_name 在更新或删除之前引用现有行的列。 NEW.col_name 指的是要插入的新行的列或更新后的现有行。

【问题讨论】:

  • @lad2025 这不起作用 MySQL 返回“找不到表 DatabaseName.NEW”
  • 无论如何手动指定所有列名,因为SELECT * 是不好的做法 9/10 案例
  • 我其实不同意。我一直看到人们说做 x 是一种不好的做法,但 x 存在是为了使用,仅仅因为有些人滥用并不意味着它是不好的做法。如果您确实想要 ALLSELECT * 正是您应该使用的
  • @Arijoon 谢谢你的评论。请查看已编辑的问题
  • NEW 是行名还是表名?它必须是一个表名。 SELECT <columns> table_name 是正确的语法,只支持表名

标签: mysql triggers insert


【解决方案1】:

尽管这个问题一直没有得到解答,但您可以SELECT 源表中使用主键的所有字段(如果有的话)。

CREATE TRIGGER replicated_table AFTER INSERT ON source_table FOR EACH ROW
BEGIN
    INSERT INTO replicated_table SELECT * FROM source_table WHERE id=NEW.id;
END

另外,也许您可​​以更喜欢使用REPLACE 而不是INSERT,以确保表格不会脱离sincronization。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2015-09-18
  • 2020-08-16
  • 1970-01-01
  • 2017-04-10
  • 2015-11-06
  • 1970-01-01
  • 2011-09-22
  • 1970-01-01
相关资源
最近更新 更多