遇到一个需求,已有的一个表,需要把已有的一个普通索引变成唯一索引,表数据量大约在百万级别,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)
相关推荐
SQL Server 中 Alter Table 语句的主要作用是对已经创建的表进行修改、添加、删除约束、修改表结构等操作。下面是 Alter Table 语句的一些用法: 添加约束 Alter Table 语句可以用来添加约束到已经创建的表中,...
在 Oracle 数据库中,`ALTER TABLE` 语句用于动态地修改表结构而不影响已有的数据。Oracle 支持多种数据类型,如字符串类型 (`VARCHAR2`, `CHAR`), 数值类型 (`NUMBER`, `FLOAT`), 日期类型 (`DATE`) 等。 #### ...
本文将详细阐述如何使用`ALTER TABLE`来执行各种操作,包括添加字段、删除字段、修改字段、改变字段数据类型、更改表引擎、重命名表、移动表至其他数据库、添加和删除主键、外键以及索引。 1. **添加字段**: 使用...
在MySQL中,`ALTER TABLE`语句是一种非常实用的工具,它允许用户修改现有表的结构,包括但不限于添加、删除或修改列、更改表名以及调整表的存储引擎等。这种灵活性极大地提高了数据库管理的效率,使得开发人员能够在...
- **添加约束**: 包括主键、外键、唯一性约束等,例如:`ALTER TABLE 表名 ADD CONSTRAINT 约束名 PRIMARY KEY (列名);` - **删除约束**: `ALTER TABLE 表名 DROP CONSTRAINT 约束名;` - **更改索引**: 可以添加...
### SQL中的ALTER TABLE语句详解 #### 一、概述 在数据库管理中,经常会遇到需要对已有的表结构进行修改的情况。例如,可能需要添加新的字段、修改字段的数据类型、删除不再使用的字段或者更改索引等。这时就需要...
在数据库管理中,`ALTER TABLE` 和 `CREATE TABLE` 是两个非常重要的SQL语句,用于对已有表格结构进行修改和创建新的表格结构。在Access和VB6(Visual Basic 6)环境中,这些功能同样得到支持,尽管它们可能具有与...
在本篇文章中,我们将深入探讨`ALTER TABLE MOVE`的相关知识,以及它在实际数据库管理和优化中的应用。 首先,`ALTER TABLE MOVE`的主要用途是改善表的性能。当表的数据文件(datafile)过大或者需要进行表空间迁移...
它可以通过更改、添加、删除列和约束,或者通过启用或禁用约束和触发器来更改表的定义。 ALTER TABLE 语句有多种子形式,包括: 1. ADD COLUMN:向表中添加一个新的字段。语法与 CREATE TABLE 中的语法相同。 ...
MySQL 唯一索引重复插入数据解决方案总结是指在 MySQL 中遇到唯一索引重复插入数据时的解决方案,可以使用 ignore 语句或 on duplicate key update 语句来解决该问题,并且可以根据具体情况选择合适的解决方案。
本文将深入探讨`ALTER TABLE`的使用,包括添加、修改和删除字段、索引、主键等操作,并通过实例来解释这些概念。 首先,`ALTER TABLE`的基本语法如下: ```sql ALTER [IGNORE] TABLE tbl_name alter_specification...
MySQL的`ALTER TABLE`命令是数据库管理中非常重要的一个功能,它允许用户在不丢失已有数据的情况下修改表的结构。这个命令广泛应用于调整数据库设计,如添加或删除字段,更改字段属性,设置或删除主键,添加索引等。...
MySQL Alter Table 语句是一种 poderosa 语句,允许用户修改表信息,包括增加或删减字段、更改字段的数据类型和属性、创建或取消索引、修改表的评注和表的类型等。 增加字段 ALTER TABLE 语句可以增加新字段,语法...
`ALTER`命令主要用于修改数据库表结构,常见的操作包括但不限于添加新列、删除现有列、更改列的数据类型等。这对于维护和优化数据库非常重要。 ### 添加新列 (Add Column) `ALTER`命令可以通过`ADD COLUMN`语法来...
MySQL的ALTER TABLE语句是数据库管理系统中用于修改已有表格结构的关键命令,它允许数据库管理员对已存在的表进行各种更改,包括添加、删除或修改列,添加或删除索引,更改表名,以及调整表的存储引擎和参数。...
除了上述提到的添加字段和设置主键外,`ALTER TABLE`命令还可以进行以下操作: #### 1. 删除字段 如果需要删除表中的某个字段,可以使用如下命令: ```sql ALTER TABLE 表名 DROP COLUMN 字段名; ``` #### 2. ...
`语法不支持,需要使用`ALTER TABLE table_name DROP (column_name) ENABLE;`并配合约束条件使用。 **示例:** - **MySQL:** 向表`sc_cig_info`中添加`ci_prod_end_time`字段。 ```sql ALTER TABLE sc_cig_info ...
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语法如下: ALTER [IGNORE] TABLE tbl_name alter_spec...