我不确定它是否可行,但有没有办法在数据库中重新分配属性'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
我无法找到完成这项工作的方法。我希望你能提供帮助。
答案 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)
如果你的桌子上有任何外键,这将不起作用