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

the*_*ott 125 mysql insert-id

我有以下查询:

INSERT INTO table (a) VALUES (0)
  ON DUPLICATE KEY UPDATE a=1
Run Code Online (Sandbox Code Playgroud)

我想要插入或更新的ID.通常我会运行第二个查询以获取此信息,因为我认为insert_id()只返回'inserted'ID而不是更新的ID.

有没有办法INSERT/UPDATE并检索行的ID而不运行两个查询?

fre*_*rik 161

查看此页面:http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
在页面底部,他们解释了如何通过传递表达式使LAST_INSERT_ID对更新有意义到MySQL的功能.

从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;
Run Code Online (Sandbox Code Playgroud)

  • 在5.1.12之后,这应该不再需要了,但是今天我发现了一个例外.如果您有自动增量pk,并且在电子邮件地址上有唯一键,并且基于电子邮件地址触发'重复更新',请注意last_insert_id'不会是更新行的自动增量值.它似乎是最近插入的自动增量值.这产生了巨大的差异.解决方法与此处所示相同,即在更新查询中使用id = LAST_INSERT_ID(id). (12认同)
  • 据说php函数mysql_insert_id()在两种情况下都返回正确的值:http://www.php.net/manual/en/function.mysql-insert-id.php#59718. (7认同)
  • 不知怎的,我在看那个页面时错过了.所以更新部分显示为:UPDATE id = LAST_INSERT_ID(id)并且效果很好.谢谢! (2认同)
  • @PetrPeller - 好吧,没有看MySQL内部,它可能意味着它会产生一个值,但是这个值与你刚刚运行的查询无关.换句话说,一个难以调试的问题. (2认同)
  • 现在引用的部分已更改,对于 [the Docs](https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html):`如果表包含 AUTO_INCREMENT 列和 INSERT ... ON DUPLICATE KEY UPDATE 插入或更新一行,LAST_INSERT_ID() 函数返回 AUTO_INCREMENT 值。` (2认同)

Ale*_*vic 34

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

INSERT INTO table (a) VALUES (0)
 ON DUPLICATE KEY UPDATE a=1
Run Code Online (Sandbox Code Playgroud)

并且'id'是自动增量主键,而不是这个工作解决方案:

INSERT INTO table (a) VALUES (0)
  ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), a=1
Run Code Online (Sandbox Code Playgroud)

全部在这里: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列.

  • 感谢您发布此答案,它更容易阅读 (9认同)
  • 是的,请参阅您所说的相同的答案.没有必要恢复3岁的帖子.无论如何,谢谢你的努力. (5认同)