SQL Server研习录(28)——主键与索引的关系与区别
版权声明
- 本文原创作者:清风不渡
- 博客地址:https://blog.youkuaiyun.com/WXKKang
此篇博客主要是为了将主键与索引的知识进行一个系统的总结,并将他们的关系与区别记录下来,进行一次梳理,如有错误,欢迎各位指正
一、什么是主键?
主键(PRIMARY KEY)就像我们的身份证号一样是唯一的,如果我们将一个表中的某一列定义为了主键,那么在该表的数据中,这个字段的值就不能重复,且不可以为NULL值,主键(PRIMARY KEY)约束是数据库表中的每条记录的唯一标识
注:若需了解主键的详细知识,请移步我的另一篇博客:SQL研习录(20)——主键约束
二、什么是索引?
索引(INDEX)就像是一本书的目录一样,当我们想要查询一本书中与某个特定主题相关的所有页面的时候,我们会先去查询目录(索引),它按照字母表顺序列出了所有主题,然后从索引中就可以找到一页或多页与该主题相关的页面,简单来说,索引就是指向表中数据的指针
并且索引分为:唯一索引、主键索引、聚集索引、非聚集索引、复合索引、全文索引、隐式索引
注:若需了解索引的详细知识,请移步我的另一篇博客:SQL研习录(25)——索引
三、主键和聚集索引的区别
我们知道,当我们在一张表上定义一个主键的时候,sql server会自动为它创建主键索引,它要求主键中每个值是非空并且唯一的
那么,建立在主键之上的索引就一定是聚集索引吗?显然不是的,我们在创建表的时候就可以指定主键是否为聚集索引,代码如下:
USE [DEMO]
GO
CREATE TABLE PKCL_DEMO(
ID INT PRIMARY KEY CLUSTERED --聚集索引
)
GO
CREATE TABLE PKNCL_DEMO(
ID INT PRIMARY KEY NONCLUSTERED --非聚集索引
)
GO
DROP TABLE PKCL_DEMO
DROP TABLE PKNCL_DEMO
GO
注:如果不添加CLUSTERED或NONCLUSTERED关键字,那么默认为聚集索引
并且,像上面给主键指定索引,不论它是聚集索引还是非聚集索引,该列的值都是不能重复的
但是如果该列不是主键并且该列上的索引为聚集索引,那么该列的值是可以重复的
四、复合主键的重复值
如果一个表中有一个主键的时候,那么该列的值一定是不能重复并且不能为NULL值的
但是一个表中的主键为多个列组成的复合主键时,其中某一列的值是可以重复的,但必须保证组成主键的这几个列的组合必须是唯一的