MySQL更新AUTO_INCREMENT pk以保留行排序

时间:2015-04-29 17:00:35

标签: mysql primary-key auto-increment

我有一个包含三列的表:idforeign_idtag。此表上的查询首先由foreign_id排序,然后由tag排序,但我们要弃用tag列,以支持更可靠和自动生成的id。在这样做时,我们还需要保留tag列中存储的排序数据,而不保留tag。这种排序仅在foreign_id列的范围内有意义。

要解决此问题,我们已决定更新每个id范围内的foreign_id,以便ID的顺序保留tag订单信息。

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

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

1 个答案:

答案 0 :(得分:0)

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语句执行此类操作。或者,您可以将最后一次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。