AUTO_INCREMENT当前值受手动插入的影响

时间:2014-07-20 20:17:13

标签: mysql

我只是想出了一个auto_increment行为,这完全有道理,但我想避免:

一个很好的例子值得千言万语:

create table test(id int not null auto_increment,somecrap text) ENGINE = INNODB;
insert into test(somecrap) values ('a');
insert into test(id,somecrap) values (100000,'b');
insert into test(somecrap) values ('c');

结果如下:

╔════════╦══════════╗
║   id   ║ somecrap ║
╠════════╬══════════╣
║      1 ║ a        ║
║ 100000 ║ b        ║
║ 100001 ║ c        ║
╚════════╩══════════╝

以下是我希望看到的内容:

╔════════╦══════════╗
║   id   ║ somecrap ║
╠════════╬══════════╣
║      1 ║ a        ║
║ 100000 ║ b        ║
║      2 ║ c        ║
╚════════╩══════════╝

再一次,我完全明白为什么他们这样做了......但我的问题是:有没有办法......在手动插入ID时“停用”此自动增量值更新?

如果没有,是否有一个很好的解决方案来模拟它?

你可以做出一个假设:我知道我的自动增量不会达到100000(例如100k就是......实际用例是一个更大的数字)

我必须运行两个单独的查询,例如:

select max(id) from test where id<100000

然后插入max(id)+1

由于我的事务隔离级别是“读提交”,这种行为将引入潜在的并发问题=&gt;如果可能,我想避免它!

3 个答案:

答案 0 :(得分:1)

如果在插入后需要ID,最好使用SELECT查询和WHERE子句找到它。

这是一个非常糟糕的主意!但是:

您可以使用ALTER TABLE。 编辑:这仅适用于MySQL 5.6!

ALTER TABLE table_name AUTO_INCREMENT = ...;

Read the mysql manual

答案 1 :(得分:1)

即使你让它可靠地工作,它也总是一个黑客。实际上,ALTER TABLE(或任何其他DDL语句)将提交任何现有事务。你应该考虑另一种更清洁的方法。

简单地添加另一列(或者可能是两个,每32位一个)并使用64位id填充它们然后可以设置为您想要的值将更加清晰。如果您需要它们总是填充,则在插入后复制自动增量PK。这使得自动增量键处于静止状态,不会引入事务性问题,并且它不是一个黑客......而是以稍大的数据存储为代价。

答案 2 :(得分:0)

解决方法,它模仿Oracle序列:

只需创建一个&#39;参考&#39;表格基本上是一个键值表,其值为&#39;是一个int。

等同于mysequence.nextval的是:

UPDATE referential SET value=@newval:=(value+1) 
     WHERE key=/*put your key (class name for me) here*/;
SELECT @newval;

然后,@ newval可以安全地用作id。

警告如果在交易中执行,则此会阻止任何并行插入。因此,此请求可以在任何交易之外执行,或者参考&#39;表格可以创建为 MyISAM