问题 当自动增量与MySQL中的现有数据发生冲突时会发生什么?


我有一个带有autoincremented id列的MySQL表。 id从1开始,现在是4000s。

但是,我还需要从旧版本的应用程序将一些遗留数据移植到此表中。此数据的ID从5000开始,必须保留以用于审计目的。

如果我在自动增量计数器达到4999后插入一个条目会怎样?自动增量是否足够智能以查找下一个可用的ID,或者它会因为尝试插入已存在的id 5000而崩溃?

虽然关于如何解决这个问题的建议非常有帮助,但我也想了解MySQL在这种情况下会做什么,以及我是否需要进行干预。


12772
2017-09-30 09:02


起源



答案:


Autoincrement将使用InnoDB和MyISAM表的下一个可用ID,但您可以通过以下方式手动更改其下一个位置:

插入后,您可以将自动增量设置为高于当前最高ID的值:

ALTER TABLE tbl AUTO_INCREMENT = 9000;

7
2017-09-30 09:27



+1 - 很可能他的遗留数据有多个表格,这是围绕它的最佳方式。 - nickf
没必要,它是自动完成的。 - DisgruntledGoat


答案:


Autoincrement将使用InnoDB和MyISAM表的下一个可用ID,但您可以通过以下方式手动更改其下一个位置:

插入后,您可以将自动增量设置为高于当前最高ID的值:

ALTER TABLE tbl AUTO_INCREMENT = 9000;

7
2017-09-30 09:27



+1 - 很可能他的遗留数据有多个表格,这是围绕它的最佳方式。 - nickf
没必要,它是自动完成的。 - DisgruntledGoat


Autoincrement将使用InnoDB和MyISAM表的下一个可用ID。

我已经测试了在Windows Vista上运行的MySQL 4.1.22。我创建了两个简单的表,一个使用InnoDB,另一个使用MyISAM。每个都有一个名为'id'的自动增量主键和一个名为'description'的varchar列。

我运行了以下命令(没有错误):

INSERT INTO MyIsamTest (description)     VALUES ('autoincrement id insert'); 
INSERT INTO MyIsamTest (id, description) VALUES (100, 'manual id insert');
INSERT INTO MyIsamTest (description)     VALUES ('autoincrement id insert');

SELECT * FROM MyIsamTest;

我得到了以下结果,表明'id'列已正确自动增量:

+=====+=========================+
| id  | description             |
+=====+=========================+
|   1 | autoincrement id insert |
+-----+-------------------------+
| 100 | manual id insert        |
+-----+-------------------------+
| 101 | autoincrement id insert |
+-----+-------------------------+

我在InnoDbTest表上重复了实验,结果相同。


5
2017-10-31 13:30



我们在事务性innoDB表中发生了一些事情,它自动递增,但低于最大ID。我认为这个简单的测试太简单了。我很确定mysql会自动跳过现有ID,但我不是100% - B T
是的,我们的innoDb自动增量低于max(id),而不是shure会发生什么 - Vaclav Kohout
这里测试的问题是你插入了一个普通的insert语句。我已经有很多问题,我经常将生产数据库恢复到开发服务器上,并且开发服务器的自动增量不会更新,因此当我创建时,它与生产带来的现有记录相冲突开发中的新条目。 - Martin Greenaway


如果你只有一个没有依赖关系的遗留表,那么我要做的是创建一个临时表来插入所有新数据(ID为5000+)。然后运行:

INSERT INTO `myrealtable` (column1, column2, column3)
SELECT column1, column2, column3
FROM `temptable`;

DROP TABLE `temptable`;

...其中没有columnX列是主auto_increment id。


0
2017-09-30 09:31





在测试数据库上试一试,看看会发生什么,用lampp / xampp等。


0
2017-09-30 09:44





我相信MySQL检查你是否插入一个自动递增的列并将更新AUTO_INCREMENT以便AUTO_INCREMENT> MAX(id),但我需要查看文档。你仍然应该遵循Andrew Duffy的建议,以确保安全。


0
2017-09-30 09:54





MySQL不允许您将内部auto_increment“值”设置为低于当前最高ID。

因此,如果从5000开始添加1000行,则增量设置为6000.您仍然可以添加具有尚不存在的ID的行(例如4500),但实际上并不值得打扰。有大量的数字在6000到40亿之间。


0
2017-09-30 10:05





如果将已分配主键的数据插入MyISAM,则下一个插入的AUTO_INCREMENT列的值将为max(列)+ 1,因此它将起作用。

但是你没有使用MyISAM,因为这是重要的数据,你使用的是InnoDB,它需要上面引用的ALTER TABLE语句。


0
2017-09-30 17:15