我的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。我想解决这个问题
答案 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
,这会自动设置最低值。