MySQL更新自动增量主键以保留行顺序

MySQL更新自动增量主键以保留行顺序,mysql,primary-key,auto-increment,Mysql,Primary Key,Auto Increment,我有一个包含三列的表:id,foreign\u id,和tag。此表上的查询首先按foreign\u id排序,然后按tag排序,但我们希望弃用tag列,以支持更可靠和自动生成的id。在执行此操作时,我们还需要保留存储在tag列中的排序数据,而不保留tag。此排序仅在外来id列的范围内有意义 为了解决这个问题,我们决定在每个外来id的范围内更新ids,以便id的顺序保留标记顺序信息 如何更新AUTO_INCREMENT主键列,以便在不更改行的其余部分的情况下为其分配计数器中的下一个值 或者,如何

我有一个包含三列的表:
id
foreign\u id
,和
tag
。此表上的查询首先按
foreign\u id
排序,然后按
tag
排序,但我们希望弃用
tag
列,以支持更可靠和自动生成的
id
。在执行此操作时,我们还需要保留存储在
tag
列中的排序数据,而不保留
tag
。此排序仅在
外来id
列的范围内有意义

为了解决这个问题,我们决定在每个
外来id
的范围内更新
id
s,以便id的顺序保留
标记
顺序信息

如何更新
AUTO_INCREMENT
主键列,以便在不更改行的其余部分的情况下为其分配计数器中的下一个值

或者,如何将整行(减去主键)复制到新行并删除旧行

SELECT MAX(id) INTO @maxID FROM the_table;
UPDATE the_table SET id = id + @maxID;
SET @i := 0;
UPDATE the_table SET id = (@i := @i + 1) ORDER BY foreign_id, tag;
我不是100%肯定这会奏效;我通常不会用UPDATE语句做这种事情。或者,您可以将上次更新替换为:

INSERT INTO the_table(id, foreign_id, tag) 
SELECT (@i := @i + 1) AS `new_id`, foreign_id, tag 
FROM the_table 
ORDER BY foreign_id, tag
;
DELETE FROM the_table 
WHERE id >= @maxID
;

在任何一种情况下,这都假定当前的
id
值始终>=0。

如果您要求每个外部id的id为1-N,MyISAM可能仍然支持该设置,方法是使自动增量字段仅成为主键的一部分。我不认为ALTER会相应地更新这些值。如果这就是您想要的,我可以提供一个查询,在执行这样的更改后更新数据。