当autoincrement与MySQL中的现有数据发生冲突时会发生什么情况?

当autoincrement与MySQL中的现有数据发生冲突时会发生什么情况?,mysql,Mysql,我有一个具有自动递增id列的MySQL表。id从1开始,现在是4000 但是,我还需要从应用程序的旧版本将一些遗留数据移植到此表中。此数据的ID从5000开始,必须保留以用于审核 如果在自动递增计数器达到4999之后插入条目,会发生什么情况?autoincrement是否足够智能,可以查找下一个可用的id,或者它会因为尝试插入id 5000而崩溃,而id 5000已经存在 虽然关于如何解决此问题的建议非常有用,但我也想了解MySQL在这种情况下会做什么,以及是否需要干预。Autoincremen

我有一个具有自动递增id列的MySQL表。id从1开始,现在是4000

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

如果在自动递增计数器达到4999之后插入条目,会发生什么情况?autoincrement是否足够智能,可以查找下一个可用的id,或者它会因为尝试插入id 5000而崩溃,而id 5000已经存在


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

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

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

ALTER TABLE tbl AUTO_INCREMENT = 9000;

如果您只有一个对ids没有依赖关系的旧表,那么我要做的是创建一个临时表,将所有新数据插入(使用ids 5000+)。然后运行以下命令:

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

DROP TABLE `temptable`;

…其中没有columnX列是主要的自动增量id。

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

我相信MySQL会检查您是否在自动增量列上插入内容,并会更新自动增量,以便自动增量>MAX(id),但我需要查看文档。为了安全起见,你还是应该听从安德鲁·达菲的建议

MySQL不允许您将内部自动增量“值”设置为低于当前最高ID


因此,如果从5000开始添加1000行,则增量设置为6000。您仍然可以添加ID还不存在的行(例如4500),但这确实不值得费心。在6000到40亿之间有很多数字。

如果将已分配主键的数据插入MyISAM,则下一次插入的自动增量列的值将为max(column)+1,因此它可以工作


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

Autoincrement将为InnoDB和MyISAM表使用下一个可用id。

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

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

我得到了以下结果,这表明“id”列已正确地自动递增:

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

我在我的InnoDbTest表上重复了这个实验,得到了相同的结果。

+1-很可能有多个表包含他的遗留数据,这是最好的解决方法。我们在事务性innoDB表中进行了一些操作,它会自动递增,但是低于最大id。我认为这个简单的测试太简单了。我很确定mysql会自动跳过现有的id,但我不是100%是的,我们使用的是innoDb autoincrement低于max(id),而不是舒尔。您测试的问题是您使用了正常的insert语句插入。我遇到过很多问题,我经常将生产数据库恢复到开发服务器上,开发服务器的自动增量不会更新,因此在我去开发服务器中创建新条目时,会与从生产中带来的现有记录发生冲突。
+=====+=========================+
| id  | description             |
+=====+=========================+
|   1 | autoincrement id insert |
+-----+-------------------------+
| 100 | manual id insert        |
+-----+-------------------------+
| 101 | autoincrement id insert |
+-----+-------------------------+