unique约束
unique约束和unique索引(注意是unique索引,不是普通索引)有着微妙的关系,二者在MySQL里面是同时存在的,但是二者不能等价。unique约束可以在information_schema里面的table_constraints表中查到,索引信息可以在information_schema里面的statistics表里面查询。
(1)创建表的时候可以使用如下几种方法创建unique约束:
create table t1(id int primary key,name varchar(20) unique);=======>无法指定约束名称,系统默认约束名称和字段名相同。
create table t1(id int primary key,name varchar(20),constraint t1_unq unique(name));========>指定了约束名(或者索引名)。如果省略constraint子句或者只省略约束名称,那么约束名称和字段名相同。
create table t1(id int primary key,name varchar(20), unique index t1_name_unq(name));========>常用,相当于创建了索引。
create table t1(id int primary key,name varchar(20), unique key t1_name_unq(name));========>同上,相当于创建了索引,只是用的关键字是key,index和key在MySQL里面是同义词
(2)表已经存在时可以通过两种方式添加unique约束。
alter table t1 modify name varchar(20) unique;======>无法指定约束名称,系统默认约束名称和字段名相同。
alter table t1 add constraint t1_name_unq unique(name);======>constraint关键字指定约束名称,即索引名称。如果省略约束名或者constraint关键字和约束名,那么约束名和字段名相同。
alter table t1 add unique index t1_name_unq(name);=======>常用,约束名和索引名都为t1_name_unq
alter table t1 add unique key t1_name_unq(name);=======>同上,相当于创建了索引,只是用的关键字是key
因为unique约束和unique索引同时存在,所以我们都会用第三种方式去添加unique索(t1_name_unq为索引名称),如果不带unique关键字则说明添加的是普通索引。unique约束(unique索引)的信息会同时在information_schema里面的statistics表和table_constraints表里面保持一致。
(3)删除unique约束(索引)只能使用如下语句:
alter table t1 drop index t1_unq;