遇到如题的这么一个场景:需要在MySQL的一张innodb引擎的表(tableA)上添加一个唯一索引(idx_col1_u)。但是表中已经有大量重复数据,对于每个key(col1),有的重复2行,有的重复N行。

此时,做数据的手工清理,或者SQL处理无疑是非常耗时的。

1. Alter ignore table come to help

印象中MySQL有一个独有的 alter ignore add unique index的语法。

语法如下:

ALTER [ONLINE | OFFLINE] [IGNORE] TABLE tbl_name

行为类似于insert ignore,即遇到冲突的unique数据则直接抛弃而不报错。对于加唯一索引的情况来说就是建一张空表,然后加上唯一索引,将老数据用insert ignore语法插入到新表中,遇到冲突则抛弃数据。

文档中对于alter ignore的注释:详见:http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

IGNORE is a MySQL extension to standard SQL. It controls how ALTER TABLE works if there are duplicates on unique keys in the new table or if warnings occur when strict mode is enabled. If IGNORE is not specified, the copy is aborted and rolled back if duplicate-key errors occur. If IGNORE is specified, only the first row is used of rows with duplicates on a unique key. The other conflicting rows are deleted. Incorrect values are truncated to the closest matching acceptable value.

2.    #1062 - Duplicate entry

然而在执行了 alter ignore table tableA add unique index idx_col1_u (col1) 后,还是报了以下错误:

#1062 - Duplicate entry '111' for key 'col1'.

不是会自动丢弃重复数据么?世界观被颠覆了。查了下资料原来是alter ignore的语法不支持innodb。

得知alter ignore的实现完全取决于存储引擎的内部实现,而不是server端强制的,具体描述如下:

For ALTER TABLE with the IGNORE keyword, IGNORE is now part of the information provided to the storage engine. It is up to the storage engine whether to use this when choosing between the in-place or copy algorithm for altering the table. For InnoDB index operations, IGNORE is not used if the index is unique, so the copy algorithm is used

详见:http://bugs.mysql.com/bug.php?id=40344

3. 解决方案

当然解决这个问题的tricky的方法还是有的,也比较直白粗暴。具体如下:

ALTER TABLE tableA ENGINE MyISAM;
ALTER IGNORE TABLE tableA ADD UNIQUE INDEX idx_col1_u (col1)
ALTER TABLE table ENGINE InnoDB;

updated in 2013-09-26:

@jyzhou 分享提到,可以不用改成MyISAM,而直接使用set old_alter_table = 1; 的方法。具体做法如下:

set old_alter_table = 1;

ALTER IGNORE TABLE tableA ADD UNIQUE INDEX idx_col1_u (col1)

具体原理:http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_old_alter_table

对于有大量重复数据的表添加唯一索引相关推荐

  1. mysql大量重复值建立索引_对于有大量重复数据的表添加唯一索引

    遇到如题的这么一个场景:需要在MySQL的一张innodb引擎的表(tableA)上添加一个唯一索引(idx_col1_u).但是表中已经有大量重复数据,对于每个key(col1),有的重复2行,有的 ...

  2. mysql 添加唯一索引_浅谈Mysql索引

    文章原创于公众号:程序猿周先森.本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号. 我们都知道,数据库索引可以帮助我们更加快速的找出符合的数据,但是如果不使用索引,Mysql则会从第一条开始查询 ...

  3. python数据透视、有的value不能同时输出_python – Pandas数据透视表ValueError:索引包含重复的条目,无法重新整形...

    我有一个如下所示的数据帧(前3行): Sample_Name Sample_ID Sample_Type IS Component_Name IS_Name Component_Group_Name ...

  4. 如何给mysql表添加百万条数据_给mysql一百万条数据的表添加索引

    直接alter table add index 添加索引,执行一个小时没反应,并且会导致锁表:故放弃该办法,最终解决办法如下: 一.打开mysql 命令行客户端 这里我们那可以看到导出的数据文件所存放 ...

  5. mysql1000w数据怎么加索引_给mysql一百万条数据的表添加索引

    直接alter table add index 添加索引,执行一个小时没反应,并且会导致锁表:故放弃该办法,最终解决办法如下: 一.打开mysql 命令行客户端 这里我们那可以看到导出的数据文件所存放 ...

  6. 视图view没有主键,但可以添加唯一索引

    视图没有主键,但可以加上唯一索引 大致可以这样理解:视图是张虚拟的表. 视图所对应的数据不进行实际的存储,数据库中只存储视图的定义,对视图的数据进行操作时,系统根据视图的定义去操作与视图相关联的基本表 ...

  7. mysql去除重复数据 重建表_删除掉mysql 的.ibd,.frm,ibdata1,ib_logfile0和ib_logfile1文件后再drop表。然后重建此表,有问题吗...

    创建已经丢62616964757a686964616fe58685e5aeb931333433656631失的表结构 先要安装 mysql-utilities. // RedHatyum -y ins ...

  8. sql 增加自增列 耗时长_SQLServer为已有数据的表添加一个自增列

    ORACLE 实例及RAC ORACLE 实例及RAC 一.问题 (1)现象 部署一个sh脚本到生产oracle服务器上,该sh脚本负责读取外系统提供的txt文件,然后用sql loader入库,由o ...

  9. mysql 给表添加唯一约束、联合唯一约束,指定唯一约束的名字

    表结构 FIELD TYPE COLLATION NULL KEY DEFAULT Extra PRIVILEGES COMMENT ------------- ------------ ------ ...

最新文章

  1. iOS架构篇-4 架构模式MVVM
  2. linux route命令深入浅出与实战案例精讲
  3. JS中使用定时动态获取系统当前时间
  4. JAVA操作HDFS API(hadoop)
  5. JSP页面最终是编译为Servlet执行的
  6. ZooKeeper实战(一):ZooKeeper原理,详细安装步骤,基本命令,节点间通信原理
  7. 正则表达式(括号)、[中括号]、{大括号}的区别
  8. HTML第八章ppt,第八章 web基础教程之HTML篇v1.0.ppt
  9. elasticsearch-6.0.1安装
  10. Java LinkedList getFirst()方法与示例
  11. 简练软考知识点整理-建设项目团队
  12. nsfilemanager
  13. 计算机网络可以分为点对点网络,计算机网络第1章习题答案
  14. Python学习日记(初级篇02面向对象之基础)——黑马程序员视频学习笔记
  15. NX/UG二次开发—CAM—刀轨转曲线(支持圆弧和直线)
  16. flutter02 - 基础部件
  17. 健康低辐射,信号全覆盖,飞鱼星i-Home覆盖方案上市
  18. 推荐几个办公软件的神器
  19. 云南新开普智慧校园一卡通解决方案,K12智慧校园信息化建设解决方案
  20. 性能测试到底该怎么做?

热门文章

  1. 禁用格式工厂的Bright Data
  2. beyondcompare连接服务器
  3. html5 霸刀,基于Html5技术研发3D页游《霸刀》3月28日首测
  4. 自动驾驶在干线物流的商业化进展综述
  5. 771. 宝石与石头
  6. 金山加入微软病毒信息联盟 与世界反病毒公司共享信息
  7. [历年IT笔试题]2014京东校园招聘-软件开发笔试题
  8. SpringCloud Alibaba Sentinel实现熔断与限流
  9. python读取文件内容并操作_Python实现的读取文件内容并写入其他文件操作示例
  10. 深入理解Java虚拟机 第2版 周志明著(三)