MySQL替换并获取最后一个插入ID

时间:2014-07-01 01:16:44

标签: mysql sql

在MySQL中,REPLACE INTO查询是否可以使用LAST_INSERT_ID函数?

基本上,我必须插入一个表,只有它不存在的地方,但然后以任何方式插入第二个表,并使用第一个表的外键约束。

所以即。

REPLACE INTO TABLE1(NAME) VALUES('unique');
SET @table1_id = LAST_INSERT_ID();
INSERT INTO TABLE2(TABLE1_ID, VALUE) VALUES(@table1_id, 'Test Value');

这是否会在插入和更新中同时发挥作用?

2 个答案:

答案 0 :(得分:1)

是的,REPLACE INTO 查询会影响 LAST_INSERT_ID() 函数的结果。

Documentation 声明:

<块引用>

REPLACEINSERT 完全相同 工作,但如果表中的旧行与 PRIMARY KEY 或 UNIQUE 索引的新行具有相同的值,在插入新行之前删除旧行。

这意味着如果 INSERT 影响 LAST_INSERT_ID(),那么 REPLACE 也应该这样做。

我已经用 MySQL 8 测试过了。

答案 1 :(得分:0)

这是一个古老的问题,但是由于尚无答案...

问题在于REPLACE INTO没有设置LAST_INSERT_ID。而是使用:

INSERT INTO TABLE1 (NAME) VALUES ('unique')
    ON DUPLICATE KEY UPDATE NAME = LAST_INSERT_ID(VALUES(NAME));
INSERT INTO TABLE2(TABLE1_ID, VALUE) VALUES(LAST_INSERT_ID(), 'Test value');

假设自动递增位于NAME列上。如果自动递增位于另一列(例如ID),则必须将其更改为

    ON DUPLICATE KEY UPDATE ID = LAST_INSERT_ID(VALUES(ID)), NAME = VALUES(NAME);

请注意,INSERT INTO ... ON DUPLICATE KEY ...REPLACE INTO ...之间的差异不仅仅是最后一个插入ID。例如,在具有多个唯一键的表中,REPLACE INTO可以用一个新行替换多个现有行。