如何在 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?的主要内容,如果未能解决你的问题,请参考以下文章