我有一个包含三列的表:id
,foreign_id
和tag
。此表上的查询首先由foreign_id
排序,然后由tag
排序,但我们要弃用tag
列,以支持更可靠和自动生成的id
。在这样做时,我们还需要保留tag
列中存储的排序数据,而不保留tag
。这种排序仅在foreign_id
列的范围内有意义。
要解决此问题,我们已决定更新每个id
范围内的foreign_id
,以便ID的顺序保留tag
订单信息。
如何更新AUTO_INCREMENT
主键列,以便在不更改行的其余部分的情况下为计数器分配下一个值?
或者,如何将整行(减去pk)复制到新行并删除旧行?
答案 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。