【问题标题】:Get the LIST of last inserted id(s) after INSERT INTO in the same mysql table在同一个mysql表中INSERT INTO之后获取最后插入的id的LIST
【发布时间】:2017-07-17 23:21:25
【问题描述】:

我需要一个 MySQL 函数,在以下 SQL 指令之后获取最后插入的 id(s) 列表(不仅仅是最后一个):

insert into my_table (c1, c2, ...)
select c1, c2, ...
from my_table
where id IN (1,2,3)

更清楚地说,我想有这个表(my_table):

id | c1 | c2
-------------
1  | a  | b  
2  | a  | c
3  | b  | c
4  | .. | ..
.. | .. | ..

在 INSERT INTO 语句之后复制新值,表格现在如下所示:

id | c1 | c2
-------------
1  | a  | b  
2  | a  | c
3  | b  | c
4  | .. | ..
.. | .. | ..
.. | .. | ..
33 | a  | b
34 | a  | c
35 | b  | c

此函数应返回以下列表:33,34,35

我认为的临时解决方案是获取最后插入的 id,然后根据复制的行数“手动”创建 33、34、35 列表。

但我不知道是否存在执行此操作的 SQL 原生函数!

【问题讨论】:

  • 为什么每次插入后不获取最后一个 id 并将这些 id 放在一个列表中?您可以使用 SELECT LAST_INSERT_ID(); 作为最后插入的 id。
  • 谢谢...这可能是一个替代解决方案!
  • 实际上@LuudvanKeulen 建议你的方法是正确的。

标签: mysql sql


【解决方案1】:

我相信您正在寻找这个简单的查询:

select id
from my_table
where id >= LAST_INSERT_ID();

documentation中所述:

没有参数,LAST_INSERT_ID() 返回一个BIGINT UNSIGNED (64 位)值,表示自动生成的 first 结果为AUTO_INCREMENT 列成功插入值 最近执行的INSERT 语句。

【讨论】:

  • 我总是觉得您的回答非常出色,感谢您通过您的巨大贡献帮助我们。 +1 它总是很棒。
  • 不错的解决方案!谢谢!
  • 但是如果另一个客户端在您发出INSERT 和这个SELECT 语句之间插入行怎么办?似乎那些ids 也会被选中,如果您只想要客户插入的ids,这可能不是您想要的。即使每个客户的LAST_INSERT_ID() 不受其他客户的影响,>= 会不会导致您可能选择太多记录?
  • @kmoser 。 . . LASt_INSERT_ID() 是基于连接的,因此对其他连接的查询不应影响该值。
  • @kmoser 。 . .您可能希望使用事务来确保您获得所需的 id。如果您的插入一次只有一个,您可以安全地使用=
猜你喜欢
  • 2011-06-01
  • 2011-03-16
  • 1970-01-01
  • 2023-03-16
  • 2011-04-30
  • 2017-10-14
  • 1970-01-01
  • 2010-12-13
  • 1970-01-01
相关资源
最近更新 更多