[导入]SQL Server 索引基础知识(4)----主键与聚集索引
有些人可能对主键和聚集索引有所混淆,其实这两个是不同的概念,下面是一个简单的描述。不想看绕口文字者,直接看两者的对比表。尤其是最后一项的比较。
主键(PRIMARY KEY )
来自MSDN的描述:
表通常具有包含唯一标识表中每一行的值的一列或一组列。这样的一列或多列称为表的主键 (PK),用于强制表的实体完整性。在创建或修改表时,您可以通过定义 PRIMARY KEY 约束来创建主键。
一个表只能有一个 PRIMARY KEY 约束,并且 PRIMARY KEY 约束中的列不能接受空值。由于 PRIMARY KEY 约束可保证数据的唯一性,因此经常对标识列定义这种约束。
如果为表指定了 PRIMARY KEY 约束,则 SQL Server 2005 数据库引擎 将通过为主键列创建唯一索引来强制数据的唯一性。当在查询中使用主键时,此索引还可用来对数据进行快速访问。因此,所选的主键必须遵守创建唯一索引的规则。
创建主键时,数据库引擎 会自动创建唯一的索引来强制实施 PRIMARY KEY 约束的唯一性要求。如果表中不存在聚集索引或未显式指定非聚集索引,则将创建唯一的聚集索引以强制实施 PRIMARY KEY 约束。
聚集索引
聚集索引基于数据行的键值在表内排序和存储这些数据行。每个表只能有一个聚集索引,因为数据行本身只能按一个顺序存储。
每个表几乎都对列定义聚集索引来实现下列功能:
- 可用于经常使用的查询。
- 提供高度唯一性。
两者的比较
下面是一个简单的比较表
主键 | 聚集索引 | |
用途 | 强制表的实体完整性 | 对数据行的排序,方便查询用 |
一个表多少个 | 一个表最多一个主键 | 一个表最多一个聚集索引 |
是否允许多个字段来定义 | 一个主键可以多个字段来定义 | 一个索引可以多个字段来定义 |
是否允许 null 数据行出现 |
如果要创建的数据列中数据存在null,无法建立主键。 创建表时指定的 PRIMARY KEY 约束列隐式转换为 NOT NULL。 |
没有限制建立聚集索引的列一定必须 not null . 也就是可以列的数据是 null 参看最后一项比较 |
是否要求数据必须唯一 | 要求数据必须唯一 |
数据即可以唯一,也可以不唯一。看你定义这个索引的 UNIQUE 设置。 (这一点需要看后面的一个比较,虽然你的数据列可能不唯一,但是系统会替你产生一个你看不到的唯一列) |
创建的逻辑 |
数据库在创建主键同时,会自动建立一个唯一索引。 如果这个表之前没有聚集索引,同时建立主键时候没有强制指定使用非聚集索引,则建立主键时候,同时建立一个唯一的聚集索引 |
如果未使用 UNIQUE 属性创建聚集索引,数据库引擎 将向表自动添加一个四字节 uniqueifier 列。 必要时,数据库引擎 将向行自动添加一个 uniqueifier 值,使每个键唯一。此列和列值供内部使用,用户不能查看或访问。 |
参考:
下面这个帖子中大力的回复:
http://topic.csdn.net/t/20021212/16/1255429.html
文章来源:http://blog.joycode.com/ghj/archive/2008/01/04/113373.aspx
转载于:https://www.cnblogs.com/HappyQQ/articles/1026530.html
[导入]SQL Server 索引基础知识(4)----主键与聚集索引相关推荐
- SQL Server中的联合主键、聚集索引、非聚集索引、mysql 联合索引
我们都知道在一个表中当需要2列以上才能确定记录的唯一性的时候,就需要用到联合主键,当建立联合主键以后,在查询数据的时候性能就会有很大的提升,不过并不是对联合主键的任何列单独查询的时候性能都会提升,但我 ...
- 主键、聚集索引、非聚集索引区别
下面是一个简单的比较表 主键 聚集索引 用途 强制表的实体完整性 对数据行的排序,方便查询用 一个表多少个 一个表最多一个主键 一个表最多一个聚集索引 是否允许多个字段来定义 一个主键可以多个字段 ...
- 主键与聚集索引的区别
主键可为聚集索引也可为非聚集索引. 两者的比较 下面是一个简单的比较表 主键 聚集索引 用途 强制表的实体完整性 对数据行的排序,方便查询用 一个表多少个 一个表最多一个主键 一个表最多一个聚集索 ...
- SQL Server数据库基础知识汇总
目录 目录 一.数据库概念 1.1 什么是数据库 1.2 为什么用数据库 1.3 数据库的发展历史 1.4 数据库分类 1.5 DBMS数据库管理系统 二. SQL(Structured Query ...
- SQL - server 数据库基础知识
SQL:Structured Quety Language SQL SERVER是一个以客户/服务器(c/s)模式访问.使用Transact-SQL语言的关系型数据库管理子系统(RDBMS) DBMS ...
- 数据库开发基本操作-SQL Server数据库基础知识
数据库是一个信息系统应用程序的重要组成部分,在Web开发中,应用更加广泛,要学习好Web开发和ADO.NET,就必须对数据库有一定的了解. 数据库的概念很广,可以从很多方面进行解释.但是在计算机中,它 ...
- SQL Server 创建约束图解 唯一 主键
SQLServer中有五种约束,Primary Key约束.Foreign Key约束.Unique约束.Default约束和Check约束,今天使用SQL Server2008来演示下这几种约束的创 ...
- 两个主键怎么设置tsql_如何在sql server中设置两个主键?
展开全部 主键是数据库表的一个重要属性,建立主键可以避免表中存在完全相同的记录,也就是说主键在e68a8462616964757a686964616f31333365633938一张表中的记录值是唯一 ...
- 4 SQL server(定义表的主键 外键 ,记录增删改查)
目录 1. 主键和外键 1.1 通过管理工具创建外键 1.2 通过脚本创建外键关联 2 新增表记录 2.1 图形界面 新增记录: 2.2 SQL脚本新增记录: 2.2.1 插入单条记录 2.2 ...
- SQL server 去重复!要主键!要排序!
在SQL里,似乎去重复又要主键还要排序,那是不可能实现的:但是我把不可能,变成了可能:我做了这么久开发这个问题一直困扰着我,今天把它给解决了,分享给大家学习: SELECT * FROM ( ...
最新文章
- mysql 学习笔记(二)
- SQL Server-聚焦深入理解动态SQL查询(三十二)
- 人工玻璃体-技术指标汇总(持续更新中)
- 输入序列不连续的序列检测
- python中变量名存储在哪里_python – 如何在内部存储和映射变量名称?
- 微软2014编程之美初赛第一场——题目3 : 活动中心
- 多路查找树之2-3树的删除原理
- 如何评估一个ECG分析算法或设备
- 矩阵论作业1,2,3讲
- 「 C++ MFC 」“设置线程运行多媒体定时器”教程
- readelf命令解析及演示
- SCT2620MRER,替代TP54240,TPS54260,3.8V-60V Vin,2.5A,高效、频率可调、降压DCDC转换器
- android桌面,Android Q带来全新桌面模式
- DevExpress v18.2版本亮点——Reporting篇(三)
- 7个实战技巧帮你提升前端技术水平!
- DataOps: A New Discipline 数据治理的下一步
- 一种人机交互界面工效评价方法
- 第五次实验:简单的使用示波器
- Picture-In-Picture 画中画模式
- 深度残差学习的图像识别
热门文章
- GBTD(Gradient Boosting Decision Tree)学习
- spring boot 拦截器 或 Spring AOP 方式记录请求日志
- 迄今为止最全:Oracle WebLogic Server产品版本介绍
- 转DateTimePicker 控件的使用
- 电脑老是自动重启怎么回事??
- MOSS搜索的爬网错误【访问被拒绝。请验证默认内容访问账户是否有权访问此库】...
- 48V自动启停的Stateflow应用
- 解压速度更快, Zstandard 1.4.1 发布
- 把grid第一列设置为行号
- 非spring boot (即spring) 使用/集成 Spring cloud Config 分布式配置中心