MySQL 触发器 last_insert_id()

Posted

技术标签:

【中文标题】MySQL 触发器 last_insert_id()【英文标题】:MySQL Triggers last_insert_id() 【发布时间】:2011-10-10 15:33:50 【问题描述】:

我有表 1,其中 id 作为自动增量。 表 2 与表 1 有外键关系,我需要将表 1 生成的值插入到表 2 中

-- Trigger DDL Statements
DELIMITER $$

USE `baemer_emr`$$

CREATE TRIGGER `baemer_emr`.`after_insert_log` AFTER INSERT ON `baemer_emr`.`table1`
FOR EACH ROW
BEGIN
  INSERT INTO table2 VALUES (last_insert_id() , something);
END$$

它正在工作,但正在显示之前的数字。例如

插入表 1,id = 15。在表 2 中返回 14。有什么想法吗?

【问题讨论】:

尝试使用 new.id 或任何您命名的主键列,而不是 last_insert_id() @Skynight,除非您喜欢收到垃圾邮件,否则不要在问题中输入您的电子邮件地址。 mysql getting last_insert_id() in a trigger 的可能重复项 @Johan,谢谢没注意到。 @mellamokb,绝对是重复的谢谢。 【参考方案1】:

在触发器中,您有 2 个虚拟表,分别称为 NEWOLD 您可以使用这些虚拟表来获取新插入的值。OLD 虚拟表显然只适用于 UPDATEDELETE 触发器。 并且 DELETE 触发器没有 NEW 表。

-- Trigger DDL Statements
DELIMITER $$

USE `baemer_emr`$$

CREATE TRIGGER after_insert_log AFTER INSERT ON table1
FOR EACH ROW
BEGIN
  INSERT INTO table2 VALUES (NEW.id, something);
END$$

请注意,NEW.id _(假设 id 是一个 auto_increment 字段)_ 将尚未before insert 触发器中设置,这只是需要避免的小陷阱之一。

【讨论】:

如果同时还有 3 笔交易,NEW.id 会受到影响吗?而不是返回 12 而是返回 17? @Skynight 在after 触发器中,NEW 是只读的,触发器运行FOR EACH ROW,所以您不必担心 :-)。 非常感谢,还有一个问题...如何区分表 1 或表 2 中的 NEW.id?如果它们具有相同的列名,例如 @Johan

以上是关于MySQL 触发器 last_insert_id()的主要内容,如果未能解决你的问题,请参考以下文章

插入指向错误的 last_insert_id() 后触发

使用 LAST_INSERT_ID 插入

Last_insert_id 为带有字母和数字的自动递增列返回 0

LAST_INSERT_ID() MySQL

LAST_INSERT_ID() MySQL

转 mysql中的LAST_INSERT_ID()分析