mysql中如何取得刚刚由自增长产生的ID号

说实话,我以前做项目的时候也曾陷入过这样的困境。
你提到的场景非常经典。
尤其是在迁移旧系统或者开发新功能的时候,我们经常会遇到这种主从表的链接连接。
以我之前处理的电商系统为例。
订单表和订单明细表是典型的主从表结构。

当时我们团队已经研究这个问题一段时间了,以提高插入性能。
事实上,使用 SELECT LAST_INSERT_ID() 确实是一个很好的解决方案,但是你必须注意一些细节。
例如,在InnoDB引擎下,它返回最后插入的行的自增ID。
这种行为是线程安全的——也就是说,如果你在连接1 上执行插入操作,然后在连接2 上插入,那么连接1 使用LAST_INSERT_ID()获取的记录的ID将始终是插入记录本身的ID,而不会受到连接2 的影响。

有趣的是,这个特性实际上与MySQL的存储引擎设计有关。
在MyISAM中,LAST_INSERT_ID()返回自增ID的最大值,但InnoDB不同。
它为每个会话维护一个独立的自动递增ID计数器。
我已经在实验室环境中对其进行了测试。
当使用LAST_INSERT_ID()时,如果在事务中插入多条记录,它将仅返回第一条记录的ID。
这个描述差点把当时的一个学徒搞糊涂了。
他做了批量录入编写了脚本,但收到的 ID 都是重复的。

说到这里,我想提一下我所踏入的危险。
有一次,当我开发订单服务接口时,用户使用批量插入语句(如 INSERT INTO order...VALUES (...), (...), ...)一次提交了几十个订单。
结果,调用者得到了相同的 ID。
当时他就怀疑是不是数据库有bug。
后来查手册,发现LAST_INSERT_ID()返回的是第一个插入行的ID。
这个问题的解决办法很简单,要么使用LAST_INSERT_ID()配合MySQL的同步语句,要么拆分成单个插入然后获取ID,要么使用事务批量插入然后使用循环获取ID。

其实,不仅MySQL,你提到的MSSQL也有类似的逻辑。
之前使用SQL Server的时候,也遇到过SCOPE_IDENTITY()和IDENT_CURRENT()的区别。
IDENT_CURRENT() 确实令人困惑。
无论你在哪个会话,它都会直接返回当前标识列的最大值。
这在跨会话同步场景下特别有用,但在并发场景下也容易出现问题。

总的来说,LAST_INSERT_ID()解决方案在大多数业务场景中都工作得很好,但您需要了解它的实际局限性。
例如,如果插入一条记录,则返回ID;如果插入多条记录,则返回第一条记录的ID;在事务中,它仅与当前会话有关。
一这些细节弄清楚之后,使用起来就变得相当方便了。

MySQL自增长设置详解轻松实现ID自动递增mysql上怎么自增长

自增列必须有主键。

ID INT 为无符号自动递增 id 注释不为空。
创建表时直接添加AUTO_INCRMENT。

例如ID INT unsigned PRIMARY KEY NOT NULL AUTO_INCRMENT
插入时不需要写ID。

插入 t_user(用户名、密码)值('user1 '、'pass1 ')。

默认值为 AUTO_INCRMENT=1 0000。

例如,AUTO_INCRMENT=1 0000。

最大值为2 ^3 2 -1
注意不要手动输入 id 值。

如果表已有数据,则必须单独进行新的自增列。

称一下体重。