主键、唯一键、唯一索引区别

主键:
1.可以定义一列或多列为主键。不允许空(NULL),主健可作外健,唯一索引不可;
2.定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。


唯一键(唯一性约束):
1.唯一性约束用来限制不受主键约束的列上的数据的唯一性,用于作为访问某行的可选手段,
指定列上都不允许有相同的值,允许空(NULL)
2.唯一约束可以用于保证在基表中增加一条记录时,一个或多个列值是唯一的。

唯一索引:可以定义一列或多列为唯一索引


索引:是为了方便查询数据快速定位


外键:增加子表记录时,是否有与之对应的父表记录,如果主表没有相关的记录,从表不能插入



1.主健、唯一键,都会自动建立唯一索引;
2.主健可作外健,唯一索引不可;
3.主健不可为空,唯一索引可;
4.在创建唯一性约束和主键约束时可以创建聚集索引和非聚集索引,但在默认情况下主键约束产生聚集索引,而唯一性约束产生非聚集索引
5.约束和索引, 前者是用来检查数据的正确性,后者用来实现数据查询的优化,目的不同。


唯一性约束与唯一索引有所不同:
1.创建唯一约束会在Oracle中创建一个Constraint,同时也会创建一个该约束对应的唯一索引。
2.创建唯一索引只会创建一个唯一索引,不会创建Constraint。
3.也就是说其实唯一约束是通过创建唯一索引来实现的。

删除时这两者也有一定的区别:
1.删除唯一约束时可以只删除约束而不删除对应的索引,所以对应的列还是必须唯一的,
2.而删除了唯一索引的话就可以插入不唯一的值。


1.主键约束和唯一键约束均会隐式创建同名的唯一索引,当主键约束或者唯一键约束失效时,隐式创建的唯一索引会被删除;
2.主键约束要求列值非空,而唯一键约束和唯一索引不要求列值非空;
3.相同字段序列不允许重复创建索引;


1.索引键值不会存储空值,所以索引为空时不从索引取值
2.其实就是只索引非NULL值,唯一索引也一样,跳过NULL值不做索引
3.如果两个字段构成了一个唯一约束,其中一个字段为空,那么另一个字段的值不能出现重复。全部为NULL的情况,仍然和单字段唯一约束一样,不会造成重复,
4.唯一键是可有多行是NULL 值的
5.在mysql oracle的innodb引擎中,是允许在唯一索引的字段中出现多个null值的。

聚集索引:
由于聚集索引规定数据在表中的物理存储顺序,因此一个表只能包含一个聚集索引。
但该索引可以包含多个列(组合索引),就像电话簿按姓氏和名字进行组织一样。

非聚集索引
数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位置。
索引中的项目按索引键值的顺序存储,而表中 的信息按另一种顺序存储(这可以由聚集索引规定)。


猜你喜欢

转载自huangyongxing310.iteye.com/blog/2374758