1、唯一约束和唯一索引,都可以实现列数据的唯一,列值可以有null。
2、创建唯一约束,会自动创建一个同名的唯一索引,该索引不能单独删除,删除约束会自动删除索引。唯一约束是通过唯一索引来实现数据的唯一。
3、创建一个唯一索引,这个索引就是独立,可以单独删除。
4、如果一个列上想有约束和索引,且两者可以单独的删除。可以先建唯一索引,再建同名的唯一约束。
5、如果表的一个字段,要作为另外一个表的外键,这个字段必须有唯一约束(或是主键),如果只是有唯一索引,就会报错。
约束是业务检查,比方说非空约束,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;
可以使用这个索引来创建唯一约束, 而且它只在第一个列上唯一,也就是说唯一约束比索引更加严格。
那么这个索引的第二个列有什么意义?有些时候,带一些冗余列可以使得你直接从索引中取到所有SELECT的数据而无需回表
————————————————————————————————————————————————————————
约束和索引, 前者是用来检查数据的正确性,后者用来实现数据查询的优化,目的不同。
唯一性约束与唯一索引有所不同:
(1)创建唯一约束会在Oracle中创建一个Constraint,同时也会创建一个该约束对应的唯一索引。
(2).创建唯一索引只会创建一个唯一索引,不会创建Constraint。
也就是说其实唯一约束是通过创建唯一索引来实现的。
1、主键约束要求列值非空,而唯一键约束和唯一索引不要求列值非空,都不能有重复数据。
2、主键约束和唯一键约束会隐式创建同名的唯一索引,当主键约束或者唯一键约束失效时,隐式创建的唯一索引会被删除。
3手动创建索引后再创建约束,删除约束,不会删除索引,创建约束自动创建的索引会在约束失效或删除后自动删除。
4、相同字段序列不允许重复创建索引。
1.建表时加上唯一性约束
CREATE TABLE `t_user` (
`Id` int(11) NOT NULL AUTO_INCREMENT, -- 自增
`username` varchar(18) NOT NULL unique, -- 唯一性约束
`password` varchar(18) NOT NULL, PRIMARY KEY (`Id`)
) ENGINE=InnoDB AUTO_INCREMENT=1018 DEFAULT CHARSET=utf8;
2.给已经建好的表加上唯一性约束
ALTER TABLE `t_user` ADD unique(`username`);
在删除时这两者也有一定的区别:
删除唯一约束时可以只删除约束而不删除对应的索引,所以对应的列还是必须唯一的,
而删除了唯一索引的话就可以插入不唯一的值。
索引是使用 create/drop index 创建和删除的而约束是使用 alter table tb add constraint 建立, 使用 drop constraint 删除
本文详细阐述了MySQL中唯一约束和唯一索引的区别,包括它们在数据唯一性、创建与删除的关系、外键引用要求以及在数据验证和查询优化上的作用。唯一约束会自动创建唯一索引,但在索引独立性、约束存在时的索引管理以及外键约束要求上存在差异。同时,文章举例说明了如何使用索引来创建唯一约束,并指出在某些情况下,索引的冗余列可能提高查询效率。
1451

被折叠的 条评论
为什么被折叠?



