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.
留言