【问题标题】: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?数百个用户呢?

谢谢。

【问题讨论】:

  • 这可能是真的,但据我所知,你没有这样的保证。

标签: mysql bulkinsert


【解决方案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;
    

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

    【讨论】:

    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-28
      • 2019-07-12
      相关资源
      最近更新 更多