Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php “自动递增”的问题;id";柱_Php_Mysql_Database_Auto Increment - Fatal编程技术网

Php “自动递增”的问题;id";柱

Php “自动递增”的问题;id";柱,php,mysql,database,auto-increment,Php,Mysql,Database,Auto Increment,我的db表看起来像这张图片 最近我创建了delete.php页面。它工作正常,但当我删除第21个用户时,下一个注册用户将获得第24个id,而不是21个id 是否可以将新注册的用户信息放入第一个空行?(在这种情况下,第21排) 在我的注册表中,新注册的用户可以写下现有用户的名字,并在注册后与他们成为朋友。对于这种友谊,我有另一个表,它将新注册用户的id和现有用户的id关联起来 为此,我在注册期间使用mysql\u insert\u id来获取新用户的id。但在nex注册过程中删除了第21行之后,m

我的db表看起来像这张图片

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

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


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


为此,我在注册期间使用mysql\u insert\u id来获取新用户的id。但在nex注册过程中删除了第21行之后,mysql_insert_id给了我21号。但存储在第24行。并放入新用户的关联表21。我想解决这个问题

一个MySQL
auto_increment
列在内部维护一个数字,并且将始终递增它,即使在删除之后也是如此。如果需要填充空白,则必须在PHP中自行处理,而不是在表定义中使用
auto_increment
关键字

如果您需要维护外键关系,那么回滚以填充空行ID可能会导致各种各样的困难,这是不建议的

可以使用SQL语句重置
自动增量
,但不建议这样做,因为这将导致重复的键错误

-- Doing this will cause problems!
ALTER table AUTO_INCREMENT=12345;
编辑 要按照注释中的说明强制执行外键关系,应在表定义中添加:

FOREIGN KEY (friendid) REFERENCES registration_table (id) ON DELETE SET NULL;
填写正确的表格和列名。现在,当用户从注册中删除时,他们的好友关联为空。如果需要与其他用户重新关联,则必须使用PHP处理
mysql\u insert\u id()
不再有用

如果删除后需要在数据库中找到编号最高的id以与好友关联,请使用以下命令

SELECT MAX(id) FROM registration_table;

使用自动增量id列时,不会通过删除条目来减少下一个条目将被分配的值。这不是自动增量列的用途。数据库引擎将始终在新插入时递增该数字,在删除时从不递减该数字。

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

很容易,不会。你可以做的(但我不建议做)是创建一个SQL函数来确定当前未占用的最低数量。或者,您可以创建一个已删除ID的表,并从中获取最小的编号。或者,这是最好的办法,忽略这些差距,意识到数据库很好。

您可以通过向表中添加一个名为user\u order的额外列来实现。然后,您可以编写代码来管理插入和删除,以便此列始终是连续的,没有间隙


通过这种方式,您可以避免因使用自动增量列而产生的问题。

重置自动增量值不是一种好做法,但如果确实需要,您可以:

ALTER TABLE mytable AUTO_INCREMENT = 1;

每次删除后运行此查询。自动增量值将不会设置为
1
,这将自动设置可能的最低值。

我可以用mysql\u insert\u id执行此操作吗?@Tural-Teyyuboglu:mysql\u insert\u id()获取上次插入的id。如果递增并存储该值,则可以在下次插入时再次使用该值。虽然这是不必要的,因为您已经知道上次插入时使用的id。@Teyyuboglu否,因为
mysql\u insert\u id
将只检索上次使用的id。如果您删除一行,
mysql\u insert\u id()
仍将返回上次插入的id并留下空白。在我的注册表中,新注册用户可以写下现有用户的名字,注册后可以和他们成为朋友。对于这种友谊,我有另一个表来关联新注册用户和现有用户的id。为此,我在注册期间使用mysql\u insert\u id来获取新用户的id。但在nex注册过程中删除了第21行之后,mysql_insert_id给了我21号。但存储在第24行。并放入新用户的关联表21。我想解决这个问题请帮助我认识到我的想法你可能误解了mysql\u insert\u id()。它返回最后插入的id。反复调用它将始终返回最后一个,而不会返回下一个。在另一次插入完成之前,其值不会更改。您好,您提供的链接不再有效。你能把它换掉吗?@natural,让我们想象一下你有表1和表2。表2有一个表1的外键。假设您从表1中删除了一些内容,然后将新行添加到同一个表中。因此,新行获得与已删除行相同的id。但现在我们可以看到这样一种情况:表2中的一行指向表1中的新行。前面这一行指向我们删除的行,现在它指向一个新行。正如你们所看到的,这是可以的,对不起,在我的最后一句话中,我想说这是不可以的。但我想你明白了:)