php - 重新排列主键

标签 php mysql primary-key

我有一个 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 |
|______|____________|_____________|

E002E004 之间出现间隙。

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

+------+------------+-------------+
|  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/

相关文章:

javascript - 为 WordPress 自定义帖子类型创建动态子帖子

php - 只允许通过应用程序访问 PHP 文件

mysql - 复合键中的 AUTO_INCRMENT

c# - 避免带参数的 SQL 注入(inject)?

sql-server - 在表变量上使用主键来提高查找性能

使用 INSERT INTO ... ON DUPLICATE KEY UPDATE 时的 Mysql 主键

php - 如何知道 wordpress 插件是否安全

php - 将 SQL SUM() 查询设置为 PHP 变量,并回显结果

python - 将元组转换为日期时间

android - 处理键盘上的 Enter 和搜索键