重新排列主键

时间:2012-09-18 04:00:52

标签: php mysql primary-key

我有一个PHP页面,它与这个小型MySQL数据库表交互,结构简单。 IDNameAddress是字段。 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 ,依此类推。就像记录退后一步

有没有办法以编程方式执行此操作?

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分: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