我有以下疑问:

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

我想要插入或更新的ID.通常我会运行第二个查询来获得这个结果,因为我相信insert_id()只返回"inserted"id,而不是更新的id.

有没有一种方法可以在不运行两个查询的情况下插入/更新和检索行的ID?

推荐答案

Check this page out: https://web.archive.org/web/20150329004325/https://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
At the bottom of the page they explain how you can make LAST_INSERT_ID meaningful for updates by passing an expression to that MySQL function.

来自MySQL文档示例:

如果表格包含自动增量列并插入...UPDATE插入一行,最后一个函数返回自动增量值.如果语句改为更新一行,则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;

Mysql相关问答推荐

如何在循环查询中删除默认架构?

同一类型对象之间的多对多关系

用于搜索从各种表中获得的结果的查询

SQL:CAST与窗口函数组合导致语法错误

根据SQL中的平均范围对学生进行排名

Hibernate 不创建表'

PythonAnywhere中SSH到MySQL数据库无限期挂起,SSH正确,workbench可以完美连接

获取最大登录应用程序用户数以及何时

Eloquent:通过国外模型得到平均分

如何在不使用子查询的情况下按最小日期计算新用户?

MySQL中的会话客户端是什么

更新和替换未加引号的 JSON 字符串

如何显示患者预约中的专业人员姓名?

如何在任何连续范围内获得最大值

如何判断嵌套查询返回的元组中的每个条目是否相同?

SQL 查找边界之间的值

MySQL函数查找两个日期之间的工作日数

从mysql中的大表中快速 Select 随机行

如何在 MySQL 中删除此索引?

与 MySql 的连接正在自动中止.如何正确配置Connector/J?