自动递增“id”列的问题

时间:2011-06-17 20:19:28

标签: php mysql database auto-increment

我的db表看起来像这张照片。 http://prntscr.com/22z1n

最近我创建了delete.php页面。它工作正常,但当我删除第21个用户下一个注册用户得到第24个ID而不是21。

是否可以将新注册的用户信息放到第一个空行? (在这种情况下排第21行)

在我的注册表格中,新注册的用户可以在注册后写下现有用户的姓名,并与他们成为朋友。对于这种友谊,我有另一个表关联新注册用户和现有用户的ID。

为此目的,我在注册期间使用mysql_insert_id获取新用户的id。但是在nex注册过程中删除了第21行后,mysql_insert_id给了我21号但是存储在第24行。并为新用户提供关联表21。我想解决这个问题

6 个答案:

答案 0 :(得分:3)

使用自动增量id列时,删除条目不会减少分配下一个条目的值。这不是自动增量柱的用途。数据库引擎将始终在新插入上增加该数字,并且永远不会在删除时减少该数字。

答案 1 :(得分:2)

MySQL auto_increment列在内部维护一个数字,并且即使在删除后也会一直增加它。如果您需要填写空白区域,则必须自己在PHP中处理它,而不是在表定义中使用auto_increment关键字。

如果要维护外键关系,回滚以填充空行id会导致各种困难,并且确实不建议。

可以使用SQL语句重置auto_increment,但不建议这样做,因为它会导致重复的键错误。

-- Doing this will cause problems!
ALTER table AUTO_INCREMENT=12345;

修改 要按照注释中的说明强制执行外键关系,您应该添加到表定义中:

FOREIGN KEY (friendid) REFERENCES registration_table (id) ON DELETE SET NULL;

填写正确的表格和列名称。现在,当从注册中删除用户时,他们的朋友关联将被清零。如果您需要与其他用户重新关联,则必须使用PHP进行处理。 mysql_insert_id()不再有用。

如果您需要在删除后仍然在数据库中找到编号最高的ID以与朋友关联,请使用以下内容。

SELECT MAX(id) FROM registration_table;

答案 2 :(得分:2)

自动增量是一个序列键,它作为表的一部分被跟踪。删除行时不会返回。

答案 3 :(得分:1)

很容易,没有。您可以做什么(但我不建议这样做)是使用SQL函数来确定当前未被占用的最小数字。或者,您可以创建已删除的ID表,并从中获取最小的数字。或者,这是最好的主意,忽略差距并实现数据库正常。

答案 4 :(得分:1)

您想要做的是通过在表中添加一个名为user_order的额外列来实现。然后,您可以编写代码来管理插入和删除,以便此列始终是顺序的,没有间隙。

这样可以避免使用auto_increment列时遇到的问题。

答案 5 :(得分:1)

重置auto_increment值不是一个好习惯,但如果你真的需要这样做,那么你可以:

ALTER TABLE mytable AUTO_INCREMENT = 1;

每次删除后运行此查询。 Auto_increment值不会设置为1,这会自动设置最低值。