Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.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 从带有“AUTO_INCREMENT”-mysql的字段中获取未使用的id_Php_Mysql_Auto Increment - Fatal编程技术网

Php 从带有“AUTO_INCREMENT”-mysql的字段中获取未使用的id

Php 从带有“AUTO_INCREMENT”-mysql的字段中获取未使用的id,php,mysql,auto-increment,Php,Mysql,Auto Increment,假设我在一个表中有一个名为id的字段,比如tb_示例。这个id具有AUTO_INCREMENT属性。因此,在每一个新的插入,它会像1,2,3,。。。。。等等 现在假设有10行id为1-10的数据。有人删除了id=5的数据。现在,对于下一次插入,我想在位置5而不是11插入数据,我还想在插入之前获得未使用的id。这意味着我希望获得未使用的id,并使用类似查询的方法插入下一个数据 "INSERT INTO tb_example .......... WHERE id=".$unused_id; 是否

假设我在一个表中有一个名为id的字段,比如tb_示例。这个id具有AUTO_INCREMENT属性。因此,在每一个新的插入,它会像1,2,3,。。。。。等等

现在假设有10行id为1-10的数据。有人删除了id=5的数据。现在,对于下一次插入,我想在位置5而不是11插入数据,我还想在插入之前获得未使用的id。这意味着我希望获得未使用的id,并使用类似查询的方法插入下一个数据

"INSERT INTO tb_example .......... WHERE id=".$unused_id;

是否有可能通过任何简单的函数或进程来获取未使用的id?也可以在一个范围内获取未使用的id吗?就像我想知道在100到200之间是否存在任何未使用的id一样?或者我需要用逻辑编码找到那个id?请帮忙……我认为没有必要。首先,如果要这样做,它必须搜索索引树?对于任何未使用的号码。想象一下,如果有一百万行,那么即使是一个简单的插入,速度也会相当慢。id还可以用作插入的基本顺序,如果您开始重用,那么这将被破坏。

最简单的方法可能是使用一个单独的表记录可重用id,您可以在每次使用触发器删除记录时插入该id。当您想插入一条新记录时,请将此表放到一边,看看是否有可重用的ID。如果是,请使用它们;如果没有,请正常插入。这还应该允许您在一个范围内轻松找到一个未使用的ID。如果查找表中存储每个可回收ID的列被编入索引,这应该是快速的。

旁注:如果MySQL允许的话,我会感到惊讶-您可能需要具有分配ID的复杂逻辑的常规列,并确保您正确处理多个请求,以获得最低未使用的idpossible重复说明为什么要这样做?@Rafecattler我需要在现有的会计软件中使用它来处理他们的引用系统。这会很慢,而且它只会捕获紧跟在现有ID之前的缺失ID,但您可以尝试这种方法:从tb_示例q中选择q.id+1不存在的示例q从tb_示例w中选择w.id,其中w.id=q.id+1按q.id ASC限制1排序。说扫描整个表是唯一的方法是不合理的。您可以将删除的ID存储在单独的表中。但你是对的,这个可能没有用例。为什么我会问我是否不需要这个??我只是不明白为什么stackoverflow中的人们更多地考虑用例而不是解决方案。无论如何,我需要它在现有的会计软件。不,他们最多只有5000行,不同的帐户使用不同的id范围。我只会为免费的id保留一个单独的表,可能会尝试在删除添加到id表时使用sql触发器。但不知道如何设置@雷夫,你说得对,我没怎么想