重新分配mysql用户ID

时间:2014-05-02 03:01:18

标签: php mysql

我不确定它是否可行,但有没有办法在数据库中重新分配属性'id',例如id = 1,2,3,4,5,6(6个元素),那么id = 3就被删除了,所以当你在数据库中查看你的'id'时会按顺序重新分配。 id = 1,2,3,4,5(删除id = 3后的5个元素)。我的'id'属性是auto_increment。

id    Name
1     A
2     B
3     C
4     D
5     E
6     F

然后删除id = 3

id    Name
1     A
2     B<--   3 is deleted
4     D<--   name C is deleted
5     E
6     F

然后我想按顺序重新分配id

id    Name
1     A
2     B
3     D
4     E
5     F

我无法找到完成这项工作的方法。我希望你能提供帮助。

2 个答案:

答案 0 :(得分:1)

如果使用surrogate KEY/PK,则将其视为代理键 - 也就是说,值为&#34;不重要&#34;除了保证每个关系域都是唯一的。

也就是说,仅仅是一个与数据无关的实现细节 - 试图&#34; compact&#34;这个序列或以其他方式使用它进行顺序排序违反了这个。

To&#34; compact&#34; auto_increment PK列,请参阅my answer here(因为需要压缩&#34;重置&#34; auto_increment种子)。但是,我建议反对这是因为它违反了代理PK专栏,根据我之前的评论。


现在,除了上述所有内容之外,我相信一个解决方案可能在中引入序列号,否则会导致程序中断&#34; 34; - 当然,取决于程序如何输入数据,它用于什么,以及它如何中断。

SET @i := 0;
SELECT
    (@i := (@i+1)) as seqNo
  , name
FROM people
ORDER BY id

此序列号(seqNo)仅与该结果集中的行号相关,否则也可能在客户端生成 - 它不是与ID相关,但ID用于保证稳定排序

答案 1 :(得分:0)

首先要仔细考虑是否真的需要这个。在我的实践中,我从来没有必要重建具有自动增量列的表的顺序。

CREATE TEMPORARY TABLE IF NOT EXISTS table2 AS (SELECT `Name` FROM `table1`);
TRUNCATE `table1`;
INSERT INTO `table1` (`Name`) (SELECT `Name` FROM table2)

如果你的桌子上有任何外键,这将不起作用