【问题标题】:MySQL update an AUTO_INCREMENT pk to preserve row orderingMySQL 更新 AUTO_INCREMENT pk 以保留行排序
【发布时间】:2015-04-29 17:00:34
【问题描述】:

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

为了解决这个问题,我们决定在每个foreign_id 的范围内更新ids,以便id 的顺序保留tag 的顺序信息。

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

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

【问题讨论】:

  • 如果您要求每个 foreign_id 的 id 为 1-N,MyISAM 仍然可以通过使 auto_increment 字段仅作为主键的一部分来支持这一点。我不认为 ALTER 会相应地更新值。如果这是您要查找的内容,我可以提供一个查询以在执行此类 ALTER 后更新数据。

标签: mysql primary-key auto-increment


【解决方案1】:
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。

【讨论】:

    猜你喜欢
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多