MYSQL插入记录跳过ID(自增)

4
我是一名新手PHP程序员,似乎无法弄清楚将记录插入到MySQL数据库时出了什么问题:
我的测试脚本(用于学习目的)调用eBay API并将请求的信息下载到MySQL数据库中,但我似乎遇到了脚本跳过自动递增ID的问题。根据我在这里阅读的内容,通常情况下是记录已被删除,但对我来说并非如此,因为没有记录被删除,而且间隙越来越大。
我的问题是:是否有其他原因会导致ID跳过随机数字?
数据库示例: 编号从1到21很好,然后变成:28、43、51、55、58 我已经检查过,接下来要添加的应该是59:
show create table 'tbl'

3
请展示您的 PHP 代码、SQL 插入语句和表格创建语句。 - David Chan
4
失败/回滚的事务也会导致此情况发生。ID 不会被重复使用或循环利用。缺乏顺序性是否会引起问题? - Marc B
1
没有办法阻止这种情况发生。这就是你的数据库的工作方式。使用一个自己的字段来跟踪它。同时使其唯一,这样你就知道没有重复项了。请每次只问一个问题。如果您愿意,可以分别提出两个问题(我已删除第二个问题)。 - hakre
我同意@hakre的观点。试图保持身份列的间隙是一场注定失败的战斗。这不是身份字段的设计目的。 - JohnFx
@user1166742:这是因为数据库决定选择哪个值。这取决于数据库的工作方式。而且数据库需要在某些方面进行优先考虑,例如当两个进程尝试同时(可能)插入新行并出现这些情况时。这就是它的工作原理。MAX(orderno) + 1 - hakre
显示剩余7条评论
2个回答

4

嗨 John, 该脚本确实可以提取交易,但应在此之后将它们全部输入到数据库中,因为它们已经排序。没有任何被删除/回滚的交易,为了测试,我将清空数据库并检索25个新交易,这些交易应该按1-25顺序输入,但似乎仍然跳过了一些ID。 - user1166742
嗨John, 我已经检查过了,但我没有删除任何ID,因此间隙不应该是由此引起的。 谢谢您的时间。 - user1166742
我认为你误解了。如果你的代码在一个被回滚的事务中添加行,那么标识增量不会被回滚。我没有说过要删除ID。 - JohnFx

0

我有点猜测代码的样子,因为我现在也在使用PayPal APIs进行工作,但是这里有一种让auto_increment发挥作用的方法

以下是我的INSERT命令看起来的样子,并且它始终在工作。但是提供一些代码肯定会有所帮助。

"INSERT INTO `table` (auto_increment_id, field1, field2, field3) VALUES ('','$field1','$field2','$field3')";

如果您在第一个()处留空,只是在VALUES后面放置值,则必须使用每个字段,但是以我展示给您的方式,您可以指定哪个字段应该获得什么值。
要连接到实时数据库,您可以使用SQLite。它们被称为数据库浏览器。

嗨,Grigor, 我现在会尝试一下并看看我能否成功,虽然我认为在值中使用NULL可以完成同样的工作? 非常感谢, - user1166742
我实际上从未尝试过使用NULL,因为这种方式对我总是有效的。 - Grigor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接