区别与联系
- 唯一约束和唯一索引,都可以实现数据列的唯一性,列值可以为null(允许存在多个null值)
- 创建唯一性约束,会自动创建一个同名的唯一索引,这个索引不能够单独删除,删除唯一约束会自动删除索引。唯一约束是通过唯一索引来实现数据的唯一
- 如果创建唯一索引,这个索引就是独立的,可以单独删除
- 如果在一个列上想有约束和索引并且两者都可以单独删除,可以先建唯一索引,再建同名的唯一约束。
- 如果表的一个字段,要作为另一个表的外键,这个字段必须有唯一约束(或是这个字段干脆就是主键),如果只是有唯一索引,就会报错
建表时加上唯一性约束
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版权协议,转载请附上原文出处链接和本声明。