0

我有一个 PHP 页面,它与这个结构简单的小型 MySQL 数据库表进行交互。ID, Name,Address是字段。ID是主键。

+------+------------+-------------+
|  ID  |   Name     |   Country   |
|______|____________|_____________|
| E001 |  Stephen   |   America   |
| E002 |  John      |   Britain   |
| E003 |  Kate      |   Canada    |
| E004 |  Carlos    |   Spain     |
| E005 |  James     |   Australia |
|______|____________|_____________|

如果我删除E003处的记录,它看起来像这样。

+------+------------+-------------+
|  ID  |   Name     |   Country   |
|______|____________|_____________|
| E001 |  Stephen   |   America   |
| E002 |  John      |   Britain   |
| E004 |  Carlos    |   Spain     |
| E005 |  James     |   Australia |
|______|____________|_____________|

E002E004之间出现间隙。

有没有办法填补这个空白?像这样

+------+------------+-------------+
|  ID  |   Name     |   Country   |
|______|____________|_____________|
| E001 |  Stephen   |   America   |
| E002 |  John      |   Britain   |
| E003 |  Carlos    |   Spain     |
| E004 |  James     |   Australia |
|______|____________|_____________|

较早的有E004的记录,落入E003的位置。前E005得到编号E004等等。喜欢记录退后一步

有没有办法以编程方式做到这一点?

4

3 回答 3

1

您是否有理由需要重新编号?关键值应该不重要。如果他们这样做(即,它们用于外部目的),请考虑让外部键成为表中的常规列,并让主键成为自动增量整数字段。即使你这样做了,你仍然可能不应该重新编号键。这意味着所有外部依赖项也需要更新。这样做并没有太大的价值。

但是,如果必须...

如果键是自动递增的(应该是),你可以这样做:

ALTER TABLE MyTable DROP ID;
ALTER TABLE MyTable ADD COLUMN ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT FIRST;

如果不是,那么您可以做几件事,但最简单的可能是使用变量作为计数器。为了使这更容易,请不要使用字符串主键,而是使用纯数字主键。

SET @id = 0;

UPDATE MyTable
SET ID = (@id := @id + 1)
ORDER BY ID;
于 2012-09-18T04:10:07.020 回答
1

在您的数据库中,表 ID 是主键,它是字母数字。

我不认为这是在表中重新排列主键的好方法。它与其他表的所有关系都会被搞砸。

尝试使用数字主键而不是字符串。

如果您使用数字主键,您可以通过删除并重新创建具有自动增量的主键列来重新排列它们。

于 2012-09-18T04:12:28.337 回答
0

由于您的ID字段不是一个integer字段,因此您不能仅通过一个查询来完成它,您需要在间隙后对所有记录进行循环并更新 ID 字段。

但更好的方法可能是将ID字段类型更改为自动递增无符号整数,然后通过知道ID间隙等于之前的最后一个,gID您可以执行如下查询:

UPDATE table_name SET `ID` = (`ID` - 1) WHERE `ID` > gID;

然后你只需要更新你的 auto_increment 值:

ALTER TABLE `table_name` AUTO_INCREMENT = (SELEC `ID` FROM `table_name` ORDER BY `ID` DESC LIMIT 1);

由于您的ID字段中的所有记录都有字母“E”,因此可以去掉这个字母并将字段类型更改为AUTO INCREMENT UNSIGNED INTEGER

于 2012-09-18T04:21:07.970 回答