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?的主要内容,如果未能解决你的问题,请参考以下文章