MySQL字段唯一性约束与唯一索引

区别与联系

  1. 唯一约束和唯一索引,都可以实现数据列的唯一性,列值可以为null(允许存在多个null值)
  2. 创建唯一性约束,会自动创建一个同名的唯一索引,这个索引不能够单独删除,删除唯一约束会自动删除索引。唯一约束是通过唯一索引来实现数据的唯一
  3. 如果创建唯一索引,这个索引就是独立的,可以单独删除
  4. 如果在一个列上想有约束和索引并且两者都可以单独删除,可以先建唯一索引,再建同名的唯一约束。
  5. 如果表的一个字段,要作为另一个表的外键,这个字段必须有唯一约束(或是这个字段干脆就是主键),如果只是有唯一索引,就会报错

建表时加上唯一性约束

create table t_admin(
id int not null auto_increment,
username varchar(18) not null unique, --唯一性約束
password varchar(18) not null,
primary key(id)
)

給已經建好的表加上唯一性约束

ALTER TABLE t_admin ADD unique(username)

需要注意的点

  • 约束是业务检查,比如非空约束(检查字段非空),check约束(是否符合check)
  • 索引是一种数据结构,rowid和字段值得键值对(这句话对吗)
  • 在建立唯一约束时,会自动创建一个唯一索引.并且,失效该约束时,索引自动删除.而创建唯一索引则不会自动创建唯一约束.
  • 因此在建表时,如果要创建唯一索引,最好先建唯一索引再创建唯一约束.这样的话,在进行大批量数据插入时,可以先失效约束,插入完成后再进行索引重建.(这句话是为什么)

外键引用必须要有唯一性约束,索引的键不一定要和唯一性约束完全匹配,唯一性约束可以只用索引的前导列。

create table t(
n1 number,
n2 number
)

create index t_idx on t(n1, n2)

上面创建了两个列的复合索引,并不要求是唯一索引

alter table t add constraint t_uk unique(n1) using index t_idx;

可以使用这个索引来创建唯一约束,而且只在第一列上唯一,也就是说唯一约束比索引更加严格

索引多个列的意义在于,带一些冗余列就可以直接从索引中取出查询的所有值,无需回表操作。


版权声明:本文为llzd626原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。