【问题标题】:Can I get the IDs of all updated rows?我可以获得所有更新行的 ID 吗?
【发布时间】:2011-10-01 14:13:02
【问题描述】:

假设我在 MySQL 中执行 INSERT / ON DUPLICATE KEY UPDATE,它更新了一堆行。并且该表有一个自增主键。

有什么简单的方法让 MySQL 告诉我它刚刚更新的行的 ID?

我知道我可以执行另一个 SELECT 查询来查找与 INSERT 语句使用的相同的约束,这并不难编写,但如果 MySQL 可以只跟踪 ID 似乎会更有效我。

我在手册中看到了有关 LAST_INSERT_ID 的技巧,适用于有单个插入/更新行的情况,但我想知道您要更新多行的情况。

【问题讨论】:

  • 我很确定答案是否定的。您需要在每次插入/更新每一行之前放弃扩展插入并检查约束。
  • Mchl:以下两个答案都提供了创造性的可能解决方法,但正如所问的,您的答案看起来是正确的。 :-)

标签: mysql


【解决方案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 列。

要使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 或 UPDATE 创建/影响的完整 ID 集吗?一种 ALL_LAST_INSERT_ID()ish 方法?以上是为了确保 LAST_INSERT_ID 在使用时提供合理的输出,即使有多个插入或更新也能正常工作。
  • JustDanyul:是的,我是。但据我了解, LAST_INSERT_ID (即使有这个技巧)只包含一个 ID 值。如何从中获得多个值?
  • 据我所知,你没有:)
  • @Ken,抱歉没有看到你的评论;据我了解,通过 mysql 文档;甚至LAST_INSERT_ID 也会保存最后插入的行ID。不确定是否可以获取所有插入行的 id。
【解决方案2】:

抛开效率不谈,除非您使用“Select for Update”(保持行锁定),否则您甚至无法保证您的后续 Select 会选择您刚刚更新的 SAME 行,因此即使第二次读取也不是万无一失的。 触发器在 MYSQL 中的效率相当低,但如果您真的需要这样做,请在相关表上创建触发器 [for update, insert],并将修改后的行的 ID 插入到另一个表中。您需要存储connection_id()(当前会话的),以便您可以分隔由另一个会话中的语句插入的行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-06
    • 2020-03-08
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多