`

alter ignore table 添加unique key不生效的问题和临时解决方案

 
阅读更多

      遇到一个需求,已有的一个表,需要把已有的一个普通索引变成唯一索引,表数据量大约在百万级别,duplicate的量大约在几K左右。想到了使用alter ignore table (http://dev.mysql.com/doc/refman/5.5/en/alter-table.html),于是便找了一个测试库,发现依旧报uk冲突:

 

root@test 12:55:26>alter ignore table vertical_bail_detail_0007 add unique key uk_ooid(out_order_id);
ERROR 1062 (23000): Duplicate entry 'GT2-18578' for key 'uk_ooid'

 

      开始怀疑是mysql版本的问题,于是在5.1.48和5.5.18上都试了一遍,结果一样,于是便找了一下mysql的bug,发现确实是一个innodb的bug,链接(http://bugs.mysql.com/bug.php?id=65731;http://bugs.mysql.com/bug.php?id=40344)

     bug#40344里面提到了一个解决方法:workaround is to first run "set session old_alter_table=1;"试了一下,确实可以。

 

root@test 01:41:52>set session old_alter_table =on;
Query OK, 0 rows affected (0.00 sec)
root@test 01:42:44>alter ignore table vertical_bail_detail_0007 add unique key uk_ooid(out_order_id),drop index IDX_BAIL_DETAIL_OOID;
Query OK, 1430517 rows affected (1 min 11.19 sec)
Records: 1430517  Duplicates: 103  Warnings: 0

 

ps1:注意,如果你要是想使用set session old_alter_table =on;来解决这个问题,而且有是有主备的情况,记得执行前设置一下set session sql_log_bin=off.以免备库报错,同样,还需要再备库重复一下主库的操作。

 

ps2:看了一下bug的时间,08年提的bug,12年才有人close,而且还是到5.6.6才给close,不得不吐槽一下,bug的fix周期真久...

 -----

最近看fast index creation,官方文档上列出过这个问题(http://dev.mysql.com/doc/refman/5.5/en/innodb-create-index-limitations.html)

 

 

分享到:
评论

相关推荐

    ALTER TABLE table_name

    一个字段: ALTER TABLE table_name MODIFY(字段类型 数据类型)); 添加一个字段: ALTER TABLE table_name ADD(字段类型 数据类型);

    alter table test rename test1; --修改表名alter table test add colum

    --删除表列alter table test modify address char(10) --修改表列类型||alter table test change

    SQL Server中alter table一些用法.doc

    SQL Server中alter table一些用法.doc

    alter table 2.zip_ALTER_Table_csharp_sql

    alter table in Sql server

    Alter-Table.rar_Table

    ALTER TABLE and CREATE TABLE in Access/vb6

    详细oracle笔记1

    alter table table_name add constraint key_name primary key (table_column); 指定表空间 alter table table_name add constraint key_name primary key (table_column) using index tablespace table_space_...

    java web项目单线程

    Alter table student add primary key (sno); 删除主键: Alter table student drop primary key; 删除表: Drop table student; 设外键: Alter table score add foreign key(列名) references 表名(列名) 设...

    mysql alter table修改表命令整理

    MYSQL ALTER TABLE命令用于修改表结构,例如添加/修改/删除字段、索引、主键等等,本文章通过实例向大家介绍MYSQL ALTER TABLE语句的使用方法,  MySQL ALTER语法如下: ALTER [IGNORE] TABLE tbl_name alter_spec...

    详解MySQL alter ignore 语法

    今天上班的时候,业务方问了我这样一个问题:我有一个表,需要添加一个唯一的字段,但是目前这个字段存在一些重复值,有没有好的解决办法。  这个问题刚听到的时候,说白了我是不会的,因为没有遇到过这样的需求,...

    alter table move相关知识研究

    NULL 博文链接:https://zotao.iteye.com/blog/691609

    mysql alter table命令修改表结构实例详解

    mysql alter table语句可以修改表的基本结构,例如添加字段、删除字段、添加主键、添加索引、修改字段数据类型、对表重命名等等操作,本文章通过两个简单的实例向大家介绍mysql alter table的使用方法。  实例一:...

    sql语句大全

     Alter table tabname add primary key(col) 说明:删除主键:Alter table tabname drop primary key(col) 创建索引  create [unique] index idxname on tabname(col…。) 删除索引:drop index idxname on ...

    mysql alter table命令修改表结构实例

    mysql alter table语句可以修改表的基本结构,例如添加字段、删除字段、添加主键、添加索引、修改字段数据类型、对表重命名等等操作,本文章通过两个简单的实例向大家介绍mysql alter table的使用方法  实例一:...

    超市管理系统

    table hyspjg add sl decimal(12,3) null,yzxj decimal(12,2) null,hyzxj decimal(12,2) null,zdr char(6) null, zdrq smalldatetime null,zxr char(6) null,zxrq smalldatetime null go create table dbo.sjjhjld ...

    oracle数据库安装

    1. 列的添加,修改和删除 添加列 Alter table•••add Alter table table_name add (new_colum_name datatype [default value] [not null]) 修改列类型 Alter table…modify Alter table table_name modify column_...

    oracle数据备份

    1. 列的添加,修改和删除 添加列 Alter table•••add Alter table table_name add (new_colum_name datatype [default value] [not null]) 修改列类型 Alter table…modify Alter table table_name modify column_...

    mysql alter table 修改表命令详细介绍

    ALTER [IGNORE] TABLE tbl_name alter_spec [, alter_spec ...] alter_specification: ADD [COLUMN] create_definition [FIRST | AFTER column_name ] or ADD INDEX [index_name] (index_col_name,...) or ADD ...

    MySQL Alter Table 修改表信息.docx

    MySQL Alter Table 修改表信息.docx

    MySQL中的alter table命令的基本使用方法及提速优化

    alter table tbl_name add col_name type 例如, 给pet的表增加一列 weight, mysql>alter table pet add weight int; 2. 删除列 alter table tbl_name drop col_name 例如, 删除pet表中的weight这一列 mysql>...

    ectouch企业版20150101整包,带微信通,微信支付

    ALTER TABLE `ecs_brand` ADD COLUMN `brand_banner` VARCHAR(80) NOT NULL COMMENT '商品品牌banner'; ALTER TABLE `ecs_goods` ADD COLUMN `sales_count` int(10) UNSIGNED NOT NULL DEFAULT 0 AFTER `click_...

Global site tag (gtag.js) - Google Analytics