mysql 中如何在一次性 insert 多条数据的情况下,如何获取当前插入数据的最大自增 ID

2019-06-09 21:23:21 +08:00
 xnotepad
```sql
insert into table (col1) values(c1), values(c2)
```
last_isert_id 返回的是最小值,max(id) 又不是线程安全的。
目前想到的方法是用 last_insert_id 与插入的数量做运算。
不知道有没有原生 mysql 就支持的函数可以用的?
6406 次点击
所在节点    MySQL
18 条回复
Takamine
2019-06-09 22:25:04 +08:00
emmmmm ……我感觉万恶的存储过程应该可以帮你。(づ ●─● )づ
chendy
2019-06-09 22:30:19 +08:00
取个巧,先批量插入前 n-1 个,最后单独插入最后一个拿 id
luckylo
2019-06-09 22:33:00 +08:00
last_insert_id+插入的条数?
kj1
2019-06-09 23:01:31 +08:00
c++ Java go API 都有返回值的,你是问用 SQL 语言查,而不是驱动返回值? SQL 语言无法保证一致性的
xnotepad
2019-06-09 23:07:15 +08:00
@luckylo 是的,目前就这样实现了,步长可以从 @@auto_increment_step 还是什么的取值。
xnotepad
2019-06-09 23:11:10 +08:00
@kj1 go 的哪个驱动可以正确返回?我目前用的是 https://github.com/go-sql-driver/mysql,返回的是最小值,我猜应该是采用官方的 last_insert_id() 函数实现的。
而且我要的也是当前会话的 id,不需要全局的。
kj1
2019-06-09 23:22:29 +08:00
golang lastinsertid+rowsaffected 如果插入 0 条,那么 last inserted+rows affected=0
kj1
2019-06-09 23:25:10 +08:00
if rowsaffected <= 0
logwarning
else
lastinsertid+rowsaffected-1
kj1
2019-06-09 23:27:26 +08:00
如果是 insert on duplicate update 那么各种判断要多很多
CFO
2019-06-09 23:39:46 +08:00
必须要自增 id 吗 自己生成 id 放进去行不行?
gavindexu
2019-06-09 23:41:36 +08:00
靠 timestamp 实现?
agostop
2019-06-10 08:59:01 +08:00
jdbc 不行吗?单条是能返回的,多条没试过
agostop
2019-06-10 09:00:08 +08:00
喔,没看到是 go,那不清楚,抱歉
xnotepad
2019-06-10 09:32:27 +08:00
@kj1 这个就和我前面说的一样了。需要自己再操作一步。我是想如果有类似于 postgres 中的 lastval 之类的函数可以直接返回就更好了。
毕竟自己实现还需要考虑步长等问题,比较麻烦。
kj1
2019-06-10 15:05:57 +08:00
@xnotepad 自增功能主要是去重的,dba 装机时一般没有必要将默认步长改为大于 1 吧,自己写几行代码也很快,没有必要希望 MySQL 加个新接口
superalsrk
2019-06-10 15:50:32 +08:00
select table_name, AUTO_INCREMENT from information_schema.tables where table_name="get_max_id";
xnotepad
2019-06-10 17:39:16 +08:00
@kj1 目前已经实现,发贴只是问一下大家有没有更简单的,或是官方有什么实现方式,我没发现的。
xnotepad
2019-06-10 17:43:02 +08:00
@superalsrk 你这个实现应该是非线程安全的吧?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/572206

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX