Auto_increment MySQL中的临时空白?

时间:2016-08-30 16:57:04

标签: mysql sql

假设我有一个由以下内容定义的表:

CREATE TABLE People (
    id SERIAL,
    name TEXT
);

如果我首先在表中找到最大ID,然后运行以下查询:

SELECT (id, name)
FROM People
WHERE id <= [maximum id found before];

我会得到一份人员名单。如果我使用相同的最大ID再次运行相同的查询:

  1. 我保证会得到相同的结果吗?
  2. 或者第一个查询是否可能返回一个列表,其中包含在执行第二个查询之前填入的空白,导致第二个查询有更多行?
  3. 假设除了来自任意数量的并发连接的顺序插入操作之外,不对数据库进行任何更改。

    编辑:

    我会试着澄清一下我所关注的具体案例。假设MySQL大约在同一时间获得五笔交易。事务A和B都将人员插入人员。事务C找到最大id。事务D和E都执行上面写的查询。

    这一系列事件是否可能:

    1. A被分配了一个id
    2. B被分配下一个id
    3. B已下达
    4. C已提交并返回B
    5. 的ID
    6. D已提交并返回不包含A
    7. 插入的行的列表
    8. A已提交
    9. E已提交并返回包含A
    10. 插入的行的列表

      编辑:

      我认为这种情况由于原子性是不可能的,但我希望得到一个比我更了解ACID的人的确认。

1 个答案:

答案 0 :(得分:1)

我认为您可以保证获得相同的列表,除非您以某种方式手动插入,否则不应该填写空白。 (但是,如果存在间隙,我假设可以删除行,因此可能不是完全相同的列表,因为可能已删除更多。)

来自How to reset AUTO_INCREMENT in MySQL?

  

您可以使用以下方法重置计数器:

     

ALTER TABLE tablename AUTO_INCREMENT = 1对于InnoDB,您无法设置   auto_increment值低于或等于最高当前索引。   (引自ViralPatel):

     

请注意,您无法将计数器重置为小于或等于的值   任何已经使用过的。对于MyISAM,如果值较小   大于或等于AUTO_INCREMENT中当前的最大值   列,该值重置为当前最大值加1。对于   InnoDB,如果该值小于当前的最大值   列,不会发生错误,并且不会更改当前序列值。   请参阅如何使用另一个的MAX值重置MySQL AutoIncrement   表?关于如何动态获得可接受的价值。