gpt4 book ai didi

mysql - 我能保证在 mysql 中使用单个插入语句获得连续的 id 吗?

转载 作者:行者123 更新时间:2023-11-29 16:13:51 26 4
gpt4 key购买 nike

我使用单个 INSERT 查询插入 1000 行。查询返回第一个插入行的 id。考虑到可能有多个插入查询同时运行,假设所有其他行都具有 id firstId + i 是否可以保存?

最佳答案

也许吧。通常是的,但在很多情况下这是不可靠的。

MySQL JDBC 驱动程序假设当您执行批量插入时,一批生成的自动增量值是连续的。

查看 java.com.mysql.cj.jdbc.StatementImpl.getGeneratedKeysInternal() 中的代码

简化一下逻辑,相关位是:

long beginAt = getLastInsertID();
for (int i = 0; i < numKeys; i++) {
row[0] = StringUtils.getBytes(Long.toString(beginAt));
beginAt += this.connection.getAutoIncrementIncrement();
}

因此它从第一个插入行的 id 开始,并假设后续生成的 id 值只是下一个 numKeys 值,并按 auto_increment_increment 配置设置递增(默认为 1)。

这会出错吗?是的,在某些情况下。例如:

  • 如果执行多行 INSERT,在同一 INSERT 语句中为某些行指定 NULL,为其他行指定实整数值,则JDBC 驱动程序假设 LAST_INSERT_ID() 返回的值之后所有值都是连续值,这是不正确的。

  • 如果您执行多行 INSERT...ON DUPLICATE KEY UPDATEREPLACE,其中某些行存在而其他行不存在,则会错误报告一组连续生成的 key 。

  • 如果设置innodb_autoinc_lock_mode = 2(“交错”锁定模式),则并发运行的多行 INSERT 语句可能不连续。只要有可能,它们都会生成 id 值,并且这将不可预测地交错,就像洗一副牌的两半一样。请参阅https://dev.mysql.com/doc/refman/8.0/en/innodb-auto-increment-handling.html

关于mysql - 我能保证在 mysql 中使用单个插入语句获得连续的 id 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55007957/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com