› MySQL 5.5 Community Server
› MySQL 5.6 Community Server
› Percona Configuration Wizard
› XtraBackup 搭建主从复制
Great Sites on MySQL
› Percona
› MySQL Performance Blog
› Severalnines
推荐管理工具
› Sequel Pro
› phpMyAdmin
推荐书目
› MySQL Cookbook
MySQL 相关项目
› MariaDB
› Drizzle
参考文档
› http://mysql-python.sourceforge.net/MySQLdb.html
xz
V2EX  ›  MySQL

mysql 如何把表里的主键重新排序

  •  
  •   xz · Nov 20, 2014 · 5329 views
    This topic created in 4335 days ago, the information mentioned may be changed or developed.
    主键为id 还有一个字段是time
    id越大对应的time也越大
    怎么把id重新反序排列呢?
    7 replies  •  2014-11-21 02:17:59 +08:00
    weegc
        1
    weegc  
       Nov 20, 2014
    个人觉得id是死的,不应该赋予太多的意义

    just id
    xfwduke
        2
    xfwduke  
       Nov 20, 2014
    说的不太清楚哦
    order by id desc
    order by id asc

    这样?
    aphay
        3
    aphay  
       Nov 20, 2014
    沿着b+树索引反着读一遍。
    ucaime
        4
    ucaime  
       Nov 20, 2014
    有个好玩的办法你可以试试
    ALTER TABLE `test` ADD `newid` INT(11) UNSIGNED NULL DEFAULT NULL AFTER `id`;

    再执行
    SET @i := 0;
    UPDATE `test` SET `newid` = (@i:=(@i + 1)) order by time desc;

    最后:
    ALTER TABLE `test` DROP `id`;
    ALTER TABLE `test` CHANGE `newid` `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY;

    应该就行了。执行前做好备份
    ucaime
        5
    ucaime  
       Nov 20, 2014   ❤️ 1
    @ucaime 忘了个问题,上面这个办法效率还算高,但是有个问题就是id完全重排了,没有实现你说的原位反转。

    还有个办法,如果数据量没超过65535,且数据中没有什么特别字段,可以导出excel啊之类的,在excel里反转,然后导出csv啊什么,load进去就行了。
    好吧,这个依然太笨
    xz
        6
    xz  
    OP
       Nov 20, 2014
    谢谢各位,已经解决了

    我是先复制一个表,然后把那个表里的id删了,再倒序复制数据到那个表里,然后再添加id,最后删除原表并重命名复制出的表就可以了
    msg7086
        7
    msg7086  
       Nov 21, 2014 via iPhone
    Update Set ID = 1000000000 - ID
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2350 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 08:54 · PVG 16:54 · LAX 01:54 · JFK 04:54
    ♥ Do have faith in what you're doing.