[转载]mysql 给有重复记录的表添加唯一索引

原文作者: 不详
转载地址: [[MySQL管理] mysql 给有重复记录的表添加唯一索引](http://bbs.linuxtone.org/forum.php?mod=viewthread&tid=7917)

不希望数据表中有重复记录的时候我们可以给表添加一个联合唯一索引,例如,user表中有user_id,user_name两个字段,如果不希望有两条一摸一样的的user_id和user_name,我们可以给user表添加两个字段的联合唯一索引:

alter table user add unique index(user_id,user_name);

这样当向表中添加相同记录的时候,会返回1062的添加失败信息。但是有一种情况是表中已经有n个重复的记录,这时候我们才想起来要添加唯一索引,再执行上面的操作时,数据库会告诉你已经有重复的记录了,建立索引失败,这时候,我们可以用下面的操作:

alter ignore table user add unique index(user_id,user_name);

它会删除重复的记录(别怕,会保留一条),然后建立唯一索引,高效而且人性化。尤其是上面那条的那条sql,在建立索引的同时删除了重复数据,相当有用。

索引相关操作:

查看索引:show index from 数据库表名
普通索引(index): alter table `table_name` add index 索引名称(`column`)
主键索引(primary): alter table `table_name` add primary key (`column`) 
唯一索引(unique): alter table  `table_name` add unique (`column`) 
多列索引:alter table `table_name` add index/unique 索引名称 ( `column1`, `column2`, `column3` )

1.普通索引。
这是最基本的索引,它没有任何限制。它有以下几种创建方式:

(1)创建索引:CREATE INDEX indexName ON tableName(tableColumns(length));如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是 BLOB 和 TEXT 类型,必须指定length,下同。
(2)修改表结构:ALTER tableName ADD INDEX [indexName] ON (tableColumns(length)) 
(3)创建表的时候直接指定:CREATE TABLE tableName ( [...], INDEX [indexName] (tableColumns(length)) ;

2.唯一索引。
它与前面的"普通索引"类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:

(1)创建索引:CREATE UNIQUE INDEX indexName ON tableName(tableColumns(length))
(2)修改表结构:ALTER tableName ADD UNIQUE [indexName] ON (tableColumns(length))
(3)创建表的时候直接指定:CREATE TABLE tableName ( [...], UNIQUE [indexName] (tableColumns(length));

3.主键索引
它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引:

CREATE TABLE testIndex(i_testID INT NOT NULL AUTO_INCREMENT,vc_Name VARCHAR(16) NOT NULL,PRIMARY KEY(i_testID));

当然也可以用ALTER命令。

标签: mysql, 索引, 重复

添加新评论