MySQL ON DUPLICATE KEY – 最后一次插入ID?

我有以下查询:

INSERT INTO table (a) VALUES (0) ON DUPLICATE KEY UPDATE a=1 

我想要插入或更新的ID。 通常我运行第二个查询为了得到这个,因为我相信insert_id()只返回'插入'的ID而不是更新的ID。

有没有办法来插入/更新和检索行的ID没有运行两个查询?

查看此页面: http : //dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
在页面底部,他们解释了如何通过将expression式传递给MySQL函数来使LAST_INSERT_ID对更新有意义。

从MySQL文档示例:

如果一个表包含一个AUTO_INCREMENT列,并且INSERT … UPDATE插入一行,则LAST_INSERT_ID()函数将返回AUTO_INCREMENT值。 如果语句更新一行,LAST_INSERT_ID()是没有意义的。 但是,您可以通过使用LAST_INSERT_ID(expr)来解决此问题。 假设id是AUTO_INCREMENT列。 要使LAST_INSERT_ID()对更新有意义,请按如下所示插入行:

 INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3; 

确切地说,如果这是原始查询:

 INSERT INTO table (a) VALUES (0) ON DUPLICATE KEY UPDATE a=1 

'id'是自动增加主键比这将是工作的解决scheme:

 INSERT INTO table (a) VALUES (0) ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), a=1 

都在这里: http : //dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

如果一个表包含一个AUTO_INCREMENT列,并且INSERT … UPDATE插入一行,则LAST_INSERT_ID()函数将返回AUTO_INCREMENT值。 如果语句更新一行,LAST_INSERT_ID()是没有意义的。 但是,您可以通过使用LAST_INSERT_ID(expr)来解决此问题。 假设id是AUTO_INCREMENT列。

你可以看看REPLACE,如果logging存在的话,REPLACE本质上是一个删除/插入。 但是这会改变自动增量字段,如果存在的话,这可能会破坏与其他数据的关系。

我不知道你的MySQL版本是什么,但是在InnoDB中,有一个autoinc错误

在5.1.20错误,并在5.1.23更正http://bugs.mysql.com/bug.php?id=27405

在5.1.31错误,并在5.1.33更正http://bugs.mysql.com/bug.php?id=42714

值得注意的是,这可能是显而易见的(但为了清晰起见我会说这个),REPLACE将会在插入新数据之前将现有的匹配行删除。 ON DUPLICATE KEY UPDATE将只更新您指定的列并保留该行。

从手册 :

REPLACE与INSERT完全相同,只是如果表中的旧行与PRIMARY KEY或UNIQUE索引的新行具有相同的值,则在插入新行之前删除旧行。

如果您使用自动增量,现有的解决scheme工作。 我有一种情况,用户可以定义一个前缀,它应该在3000重新开始序列。由于这个不同的前缀,我不能使用自动增量,这使得插入last_insert_id为空。 我解决了以下问题:

 INSERT INTO seq_table (prefix, id) VALUES ('$user_prefix', LAST_INSERT_ID(3000)) ON DUPLICATE KEY UPDATE id = LAST_INSERT_ID(id + 1); SELECT LAST_INSERT_ID(); 

如果前缀存在,它将增加它并填充last_insert_id。 如果前缀不存在,则会插入值为3000的前缀,并使用3000填充last_insert_id。