如何在 MySQL 中获取多个插入行的 ID?

Posted

技术标签:

【中文标题】如何在 MySQL 中获取多个插入行的 ID?【英文标题】:How do I get the ID of multiple inserted rows in MySQL? 【发布时间】:2011-11-22 00:31:14 【问题描述】:

我正在使用这个命令将一些单词插入到一个包含两列的表格中:

INSERT IGNORE INTO terms (term) VALUES ('word1'), ('word2'), ('word3');

    如何获取插入每个单词的行的 ID(主键)。我的意思是在执行INSERT 之后返回一个类似“55,56,57”的值。 mysql有这样的反应吗?

    术语列是UNIQUE。如果一个术语已经存在,MySQL 将不会插入它。是否可以返回此重复的引用(即存在该术语的行的 ID)?类似“55,12,56”的响应。

【问题讨论】:

【参考方案1】:

    您可以通过SELECT LAST_INSERT_ID(); 或通过让您的框架/MySQL 库(以任何语言)调用mysql_insert_id() 来获得它。

    那行不通。插入后必须在此处查询 ID。

【讨论】:

正确 - 不与 INSERT IGNORE 合二为一。但是在非IGNORE 中,它会为您提供生成和插入的第一个值。 如果另一个用户同时进行了另一个插入怎么办? @Pitto 不过你会从LAST_INSERT_ID() 得到正确的值。 mysql_insert_id()。前者知道当前会话中最后发生了什么,后者直接绑定到最后一个查询。如果在不同的连接中发生了其他事情,那也没有什么坏处。【参考方案2】:

为什么不只是:

SELECT ID
  FROM terms
 WHERE term IN ('word1', 'word2', 'word3')

【讨论】:

这会获取之前插入的术语,并且容易受到竞争条件的影响,即在选择查询触发之前其他东西插入记录。 ?? term 有一个 UNIQUE 条件。唯一可能在竞争条件下影响 SELECT 的是 DELETE,而不是另一个 INSERT。根据 OP 帖子中的 (2),他们希望包含先前插入的记录的 ID。 这就是我的想法;但它需要几行编码。除了 SELECT,我需要获取结果并在 while 循环中获取它们(在我使用的 php 中)。我希望能找到某种 mysql 响应。 @Googlebot 这是最好的方法。如果您想遍历 ID,只需执行 SELECT (显示在此答案中)并遍历结果。 再多几行代码是什么? 如果您真的希望 MySQL 回显 ID,您必须发出单独的单个 INSERT 语句并在每个 INSERT 之后执行 SELECT LAST_INSERT_ID() 以收集将 ID 放入数组中。【参考方案3】:

首先,要获取刚刚插入的 id,您可以执行以下操作:

SELECT LAST_INSERT_ID() ;

注意,这仅在您最后一次 INSERT 查询之后有效,并且如果您有多次插入,它将返回仅第一个 ID

然后,使用IGNORE 选项,我认为不可能获取未插入的行。当您创建INSERT IGNORE 时,您只需告诉 MySQL 忽略必须创建重复条目的行。

如果您不设置此选项,INSERT 将被停止,您将获得与复制有关的行。

【讨论】:

即使没有 IGNORE,它也只适用于单行 INSERT。我的命令是多行 INSERT 我的答案只有第一部分包括 IGNORE。 如果您使用的是 PHP,您可以使用循环将 ID 存储在表中,每个段落中都有一个 INSERT。

以上是关于如何在 MySQL 中获取多个插入行的 ID?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取由一个多行插入语句创建的行的所有 id

如何在 MySQL 中获取先前操作中 id(primary key) 的值

如何使用旧驱动程序获取 JDBC 中插入行的 ID?

如何获取 MySQL 中最后更新行的 ID?

如何在我的内容观察器中获取插入行的 URI?

获取最后插入行的主键 ID 以运行多个插入操作 [重复]