K先生个人博客

当前位置:首页 > 爱技术 > 正文

mysql在现有表上添加唯一复合索引,并删除重复数据

场景:如果在还没有插入数据的表中添加索引什么的都很简单,但是如果在已有数据下中怎么中途添加唯一索引呢?用通常的方法添加索引肯定会直接报错,因为现在表里面已经有了重复性数据了,这就和唯一索引相冲突。那么到底应该怎么在已经有重复数据的表中添加唯一索引呢?

解决方法:

如果你进行了百度,肯定会搜到用ALTER IGNORE去解决这个问题的方法,IGNORE就是忽略重复性数据只保留重复的第一条数据。

ALTER IGNORE TABLE `test` ADD UNIQUE `cid_name_type` (`c_id`, `name`,`type`);

如果你的MySQL版本是5.7.4之前的版本,那么会成功。否则就会报语法错误,因为IGNORE关键词在MySQL5.7.4之后就被废弃了,至于为什么被废弃,好像是IGNORE的存在破环了完整性约束。

那么IGNORE有替代方案吗?答案肯定是有的!

下面先说一下思路,就是先复制原表的结构创建一个临时表test_tmp,然后在这个临时表test_tmp上创建你要添加的唯一索引,然后往临时表test_tmp中插入test原表的数据,注意此时INSERT插入时IGNORE关键词是可用的,这样在插入时会自动跳过重复性数据,最后就是把两张表的名字对换一下就可以了。

CREATE TABLE test_tmp LIKE test
CREATE UNIQUE INDEX cid_type_time ON test_tmp(`c_id`,`type`,`time`)
INSERT IGNORE INTO test_tmp SELECT * FROM test
RENAME TABLE test TO test_history
RENAME TABLE test_tmp TO test

等操作完成之后,确认没有问题之后就可以把老表删除了。

作者K先生本文地址http://www.gold404.cn/info/133

版权声明:本文为原创文章,版权归 K先生个人博客 所有,欢迎分享本文,转载请保留出处,谢谢!

上一篇: git使用小笔记

下一篇: Linux怎么挂载磁盘

文章评论

* 必填
可选
可选

评论列表