假设我有一个由以下内容定义的表:
CREATE TABLE People (
id SERIAL,
name TEXT
);
如果我首先在表中找到最大ID,然后运行以下查询:
SELECT (id, name)
FROM People
WHERE id <= [maximum id found before];
我会得到一份人员名单。如果我使用相同的最大ID再次运行相同的查询:
假设除了来自任意数量的并发连接的顺序插入操作之外,不对数据库进行任何更改。
编辑:
我会试着澄清一下我所关注的具体案例。假设MySQL大约在同一时间获得五笔交易。事务A和B都将人员插入人员。事务C找到最大id。事务D和E都执行上面写的查询。
这一系列事件是否可能:
编辑:
我认为这种情况由于原子性是不可能的,但我希望得到一个比我更了解ACID的人的确认。
答案 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 表?关于如何动态获得可接受的价值。