我有一个 PHP 页面,它与这个结构简单的小型 MySQL 数据库表进行交互。 ID
、名称
、地址
是字段。 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 |
|______|____________|_____________|
E002 和 E004 之间出现间隙。
有办法填补这个空白吗?像这样
+------+------------+-------------+
| ID | Name | Country |
|______|____________|_____________|
| E001 | Stephen | America |
| E002 | John | Britain |
| E003 | Carlos | Spain |
| E004 | James | Australia |
|______|____________|_____________|
之前的记录有E004,落入E003的位置。以前的E005获得编号E004,依此类推。就像记录一样退后一步。
有没有办法以编程方式执行此操作?
最佳答案
您需要对它们重新编号有什么原因吗?关键值应该并不重要。如果确实如此(即,它们用于外部目的),请考虑让外部键成为表中的常规列,并让主键成为自动递增整数字段。即使您这样做,您仍然可能不应该对键重新编号。这意味着所有外部依赖项也需要更新。这样做没有多大值(value)。
但是,如果你必须......
如果键是自动递增的(它应该是),你可以这样做:
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;
关于php - 重新排列主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12470197/