2019-06-14 18:41:21 0 评论 MySQL Boy.Lee

MySQL 反转主键数值(倒序排列)

假设在MySQL数据库中我们有一张movie表包含1000条数据(id 从1 到 1000), 现在我们需要反转主键的数值 对齐进行倒序排列, 方法如下:

 

{ 关注movie表 }

在movie表中我们有2个字段, m_id 主键, m_imdbId 唯一的字段, 每一行数据有一个唯一字段非常重要. 当然你也可以用m_id(主键)做唯一字段, 但是强烈建议你对其进行复制, m_id -> m_id_d.

 

{ 新建临时表 }

如你所见在新的movieT表中我们有3个字段, 我们将会使用mt_id作为自增主键的特性(1-1000),  mt_v1 将储存 movie.m_imdbId 唯一的标示, mt_v2 将保存 movie.m_id(缓存备用)

CREATE TABLE `movieT` (
  `mt_id` int(11) NOT NULL AUTO_INCREMENT,
  `mt_v1` varchar(45) DEFAULT NULL,
  `mt_v2` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`mt_id`)
) ENGINE=InnoDB AUTO_INCREMENT=532768 DEFAULT CHARSET=utf8mb4;

 

{ 让我们大干一场 }

//打开外键约束, 只有打开之后关联的外键值才会更新
set foreign_key_checks=1;

//倒序填充 movieT
insert into yiilib.movieT(mt_v1, mt_v2) (select m_imdbId, m_id from yiilib.movie where m_id <= 1000 order by m_id Desc);


//更新movie表, 将m_id的范围移出0-1000
update yiilib.movie set m_id  = m_id + 10000 where m_id <= 1000;
//修改后的movie.m_id范围是 10001 -> 11000


//更新 m_id
update yiilib.movie set m_id  = (select mt_id from yiilib.movieT where mt_v1 = m_id_douban) where m_type_id = 2; //你可以添加任何你想要的条件, 但是别使用 m_id <=1000, 因为你在改变m_id所以,以防万一,不要用他作为条件

 

{ 耐心等待 }

这个操作需要一些时间, 请耐心等待, 在我的测试中16000条数据用了1分钟38秒, 所以耐心等待吧.

 

{ Summary }

主要思路就是用新表movieT的自增主键来生成需要的主键值, 之后通过唯一字段进行替换. Good Luck for your MySQL work.