MySQL 多行插入是不是获取顺序自动增量 ID?

Posted

技术标签:

【中文标题】MySQL 多行插入是不是获取顺序自动增量 ID?【英文标题】:Does a MySQL multi-row insert grab sequential autoincrement IDs?MySQL 多行插入是否获取顺序自动增量 ID? 【发布时间】:2012-01-18 20:47:35 【问题描述】:

我认为这是真的,但我没有在网上找到任何东西来证实这一点。我可以使用 last_insert_id() 获取为自动增量字段生成的第一个 id,但是我可以假设下一个记录将具有顺序 ID 吗?或者其他用户是否可以获取一个 id 以使生成的 ID 不连续?

示例:插入 mytable (asdf, qwer) 值 (1,2), (3,4), (5,6), ... , (10000,10001);

如果 mytable 有一个 autoincrement 列,并且如果两个用户同时运行此语句,一个用户会获取 10000 个顺序 ID,而另一个用户会获取接下来的 10000 个顺序 ID?数百个用户呢?

谢谢。

【问题讨论】:

这可能是真的,但据我所知,你没有这样的保证。 【参考方案1】:

多行插入只是一次又一次执行相同操作的批量操作。 触发插入语句时,它会触发生成 ID 的触发器。

因此,如果使用的数据库引擎以顺序方式执行其所有工作(类似于队列 - 先进先出),那么是的,顺序 ID 将比前一个 ID 高一个增量;如果数据是以多线程方式插入的,其中语句是并行触发的,那么不,id's will be given at "random"。

我不知道有任何 mysql 引擎可以保证这一点,但是我又没有对这个特定主题进行太多研究。

【讨论】:

【参考方案2】:

如果您使用 LOCK TABLES,批次应获取顺序 ID。

例子:

LOCK TABLES users WRITE;
<BULK INSERT HERE>
UNLOCK TABLES;

这将防止多个线程同时写入表。

【讨论】:

我可以将LOCK TABLES .. 用于innodb 引擎吗? 是 - LOCK TABLES 与 InnoDB 一起使用 - 查看锁定文档:dev.mysql.com/doc/refman/5.5/en/innodb-locking.html【参考方案3】:

这取决于使用的存储引擎。

MyISAM 保证插入的行具有顺序 ID,因为在插入期间会持有表级锁。 InnoDB:除非 innodb_autoinc_lock_mode 设置为 interleaved (2),否则插入的行将具有顺序 ID。默认情况下,InnoDB 从 5.1 开始以 consecutive 模式运行,之前以 traditional 模式运行。

有关innodb_autoinc_lock_mode 选项的更多信息,请参阅13.6.4.3. AUTO_INCREMENT Handling in InnoDB

【讨论】:

以上是关于MySQL 多行插入是不是获取顺序自动增量 ID?的主要内容,如果未能解决你的问题,请参考以下文章

C#获取mysql自动增量值[重复]

带有Python的Mysql无法插入具有自动增量ID的记录,为啥?

MySQL插入,如何从插入中获取增量ID [重复]

MySQL 和自动增量一致性

什么可能导致自动增量主键字段(mysql)上的重复 ID?

PHP MYSQL - 在不使用列名但使用自动增量字段的情况下插入