Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.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 在MySQL表中重新排序id列?_Php_Mysql - Fatal编程技术网

Php 在MySQL表中重新排序id列?

Php 在MySQL表中重新排序id列?,php,mysql,Php,Mysql,我有一个列名为id的表,以及主键和自动递增的设置。当在表格中间删除一行时,即第1-70行中的第29行,id29将消失。是否可以使行向上移动,但id仍保留在那里,即删除70而不是29,以便具有id30的行现在将采用29,31将采用30等 在我的例子中,如果可能的话,这将使向表中插入新数据变得容易得多 我真的希望在创建一个新的值之前使用完这些值,所以要么这样做很好,要么寻找丢失的值并更新它们 更新: 我想说的是,将行放在某一行的上方,如果所有id列都是按直线值顺序排列的(没有间隙),那么我就可以相对

我有一个列名为
id
的表,以及
主键
自动递增
的设置。当在表格中间删除一行时,即第1-70行中的第29行,
id
29将消失。是否可以使行向上移动,但
id
仍保留在那里,即删除70而不是29,以便具有
id
30的行现在将采用29,31将采用30等

在我的例子中,如果可能的话,这将使向表中插入新数据变得容易得多

我真的希望在创建一个新的值之前使用完这些值,所以要么这样做很好,要么寻找丢失的值并更新它们

更新:

我想说的是,将行放在某一行的上方,如果所有
id
列都是按直线值顺序排列的(没有间隙),那么我就可以相对轻松地完成

这将使在表中插入新数据时更加容易 在我的情况下,如果这是可能的

这不会对你的插入造成任何影响。该列是自动递增的,因此它在插入中是未指定的列。29岁的差距是如何让你的第1000个记录更难插入的

最重要的是,如果将值分配给主键列,则会丢失引用该列的任何表的所有引用完整性

要直接回答您的问题,您只需删除自动增量列并重新创建它。它将在1处重新开始编号,并消除间隙。但是,我强烈建议不要这样做,因为这完全没有必要

这将使在表中插入新数据时更加容易 在我的情况下,如果这是可能的

这不会对你的插入造成任何影响。该列是自动递增的,因此它在插入中是未指定的列。29岁的差距是如何让你的第1000个记录更难插入的

最重要的是,如果将值分配给主键列,则会丢失引用该列的任何表的所有引用完整性


要直接回答您的问题,您只需删除自动增量列并重新创建它。它将在1处重新开始编号,并消除间隙。但是,我强烈建议不要这样做,因为这是完全不必要的。

一般来说,更新数据库中的主键是一件麻烦事,因为这通常会通过引用该主键的所有表设置一系列更新。许多引擎允许您使用CASCADE选项强制自动执行此更新,但它仍然会导致大量不必要的数据库更新

自动递增整数主键的正常使用是永久的、无意义的、不可变的值

也就是说,如果您真的想更新这些密钥,您可以使用命令进行更新

 UPDATE YourTable SET id = id - 1 WHERE id > (value you deleted)

或者,您可以维护第二个整数列,而不是表的主键,并在每次删除后更新此列。

一般来说,更新数据库中的主键很麻烦,因为这通常会通过引用该主键的所有表设置一系列更新。许多引擎允许您使用CASCADE选项强制自动执行此更新,但它仍然会导致大量不必要的数据库更新

自动递增整数主键的正常使用是永久的、无意义的、不可变的值

也就是说,如果您真的想更新这些密钥,您可以使用命令进行更新

 UPDATE YourTable SET id = id - 1 WHERE id > (value you deleted)

或者,您可以维护第二个整数列,而不是表的主键,并在每次删除后更新此列。

回答编辑的问题

以前的ID:

SELECT id FROM $mytable WHERE id < $id ORDER BY ID DESC LIMIT 1; 

对已编辑问题的答复

以前的ID:

SELECT id FROM $mytable WHERE id < $id ORDER BY ID DESC LIMIT 1; 

自动递增主键需要是唯一的,但不需要是连续的。

你试图解决一个不需要解决的问题。自动增量主键中的间隙正常。您不需要它们是连续的。试图使它们相邻会导致更多问题:

  • 运行查询以查找差距的成本很高
  • 更新大量行以移动主键值来填补空白的成本很高。如果你有1000万行,第2行之后有一个间隙呢
  • 在转换值时,很可能会得到一个新的INSERT。现在你又得换班了
  • 如果您移动行以填充间隙,请不要忘记更改表以更改将生成的下一个自动增量值。现在,您必须在每次删除后运行两个更新和一个表锁定ALTER,这对可伸缩性非常不利
  • 如果重复使用主键值,将混淆应用程序。它可能出于某种原因删除了一行。如果应用程序基于主键搜索某个值,它应该会发现该行已被删除。它不应该找到已经转移到该位置的其他任意行

如果您需要主键是连续的,那么您可以使用它们作为事实上的计数,或者某种排序。这不是自动递增机制的设计目的。

自动递增主键需要是唯一的,但不需要是连续的。

你试图解决一个不需要解决的问题。自动增量主键中的间隙正常。您不需要它们是连续的。试图使它们相邻会导致更多问题:

  • 运行查询以查找差距的成本很高
  • 更新大量行以移动主键值来填补空白的成本很高。如果你有1000万行,第2行之后有一个间隙呢
  • 在转换值时,很可能会得到一个新的INSERT。不