我只是想出了一个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;如果可能,我想避免它!
答案 0 :(得分:1)
如果在插入后需要ID,最好使用SELECT查询和WHERE子句找到它。
这是一个非常糟糕的主意!但是:
您可以使用ALTER TABLE。 编辑:这仅适用于MySQL 5.6!
ALTER TABLE table_name AUTO_INCREMENT = ...;
答案 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