主键是一个约束(constraint),他依附在一个索引上,这个索引可以是聚集索引,也可以是非聚集索引。

所以在一个(或一组)字段上有主键,只能说明他上面有个索引,但不一定就是聚集索引。

例如下面:

 1 USE [pratice]
2 GO
3 CREATE TABLE #tempPKCL
4 (
5 ID INT PRIMARY KEY CLUSTERED --聚集索引
6 )
7
8
9 ---------------------------------
10 USE [pratice]
11 GO
12 CREATE TABLE #tempPKNCL
13 (
14 ID INT PRIMARY KEY NONCLUSTERED --非聚集索引
15 )
16
17
18 DROP TABLE [#tempPKCL]
19 DROP TABLE [#tempPKNCL]

如果不加NONCLUSTEREDCLUSTERED关键字,默认建的是聚集索引

而一个聚集索引里,是可以有重复值的。只要他没有被同时设为主键,但是主键不能有重复值(不管依附在聚集索引上还是非聚集索引上)

强调这一点,是因为有些人觉得自己的表格上设置了主键,就认为表格上有聚集索引,按照B-树的方式管理了。

如果没有指定主键是个聚集索引,可能表格还是会以堆的方式管理,效率低下


关于排序和重复值

排序:建立复合索引的时候会指定多个字段,那么这个索引顺序是按哪个字段顺序排序呢?

是按照索引上的第一个字段排序

下面这个索引的排序顺序是以ID这个字段排序的

1 CREATE INDEX tempPKNCL_id_ncl ON [dbo].[tempPKNCL]([ID],[a],[c])

重复值:如果对多列定义了 PRIMARY KEY 约束,则一列中的值可能会重复,但来自 PRIMARY KEY 约束定义中所有列的任何值组合必须唯一。

如下图所示,Purchasing.ProductVendor 表中的 ProductID 和 VendorID 列构成了针对此表的复合 PRIMARY KEY 约束。

这确保了 ProductID 和 VendorID 的组合是唯一的

意思是说,如果是复合主键,那么如果ProductID列有重复,但是 ProductID 和 VendorID 的组合是唯一的

言下之意:

(1)主键不是复合主键

(2)主键建立在ProductID字段上

(3)ProductID字段有重复值

那么主键建立肯定会失败

SQL server 聚集索引与主键的区别的更多相关文章

  1. 【SqlServer】聚集索引与主键、非聚集索引

    目录结构: contents structure [-] 聚集索引和非聚集索引的区别 聚集索引和主键的区别 主键和(非)聚集索引的常规操作 聚集索引.非聚集索引在SqlServer.MySQL.Ora ...

  2. SQL Server 创建表 添加主键 添加列常用SQL语句

    --删除主键 alter table 表名 drop constraint 主键名 --添加主键 alter table 表名 add constraint 主键名 primary key(字段名1, ...

  3. SQL Server 创建表 添加主键 添加列常用SQL语句【转】

    --删除主键alter table 表名 drop constraint 主键名--添加主键alter table 表名 add constraint 主键名 primary key(字段名1,字段名 ...

  4. SQL Server - 聚集索引 <第六篇>

    聚集索引的叶子页存储的就是表的数据.因此,表行物理上按照聚集索引列排序,因为表数据只能有一种物理顺序,所以一个表只能有一个聚集索引. 当我们创建主键约束时,如果不存在聚集索引并且该索引没有被明确指定为 ...

  5. SQL Server中的联合主键、聚集索引、非聚集索引、mysql 联合索引

    我们都知道在一个表中当需要2列以上才能确定记录的唯一性的时候,就需要用到联合主键,当建立联合主键以后,在查询数据的时候性能就会有很大的提升,不过并不是对联合主键的任何列单独查询的时候性能都会提升,但我 ...

  6. SQL Server中的联合主键、聚集索引、非聚集索引

    我们都知道在一个表中当需要2列以上才能确定记录的唯一性的时候,就需要用到联合主键,当建立联合主键以后,在查询数据的时候性能就会有很大的提升,不过并不是对联合主键的任何列单独查询的时候性能都会提升,但我 ...

  7. 从性能的角度谈SQL Server聚集索引键的选择

      简介 在SQL Server中,数据是按页进行存放的.而为表加上聚集索引后,SQL Server对于数据的查找就是按照聚集索引的列作为关键字进行了.因此对于聚集索引的选择对性能的影响就变得十分重要 ...

  8. SQL SERVER 聚集索引 非聚集索引 区别

    转自http://blog.csdn.net/single_wolf_wolf/article/details/52915862 一.理解索引的结构 索引在数据库中的作用类似于目录在书籍中的作用,用来 ...

  9. 浅谈sql server聚集索引与非聚集索引

    今天同事的服务程序在执行批量插入数据操作时,会超时失败,代码debug了几遍一点问题都没有,SQL单条插入也可以正常录入数据,调试了一上午还是很迷茫,场面一度很尴尬,最后还是发现了问题的根本,原来是另 ...

随机推荐

  1. 揭示编译器API

    编译器管道功能区 .NET编译器平台(“Roslyn”)通过提供一个API层,是一个传统编译器管道镜像,向你这样的消费者揭示了C#和Visual Basic编译器的代码分析. 这条管道的每一部分,现在 ...

  2. web--响应式导航菜单

    响应式导航菜单 代码如下 HTML代码: <!DOCTYPE html> <html lang="en"> <head> <meta ch ...

  3. django之静态文件的设置

    一:静态文件 Django中提供了一种解析的方式配置静态文件路径.静态文件可以放在项目根目录下,也可以放在应用的目录下,由于有些静态文件在项目中是通用的,所以推荐放在项目的根目录下,方便管理. 为了提 ...

  4. TCP: time wait bucket table overflow

    .TCP: time wait bucket table overflow tcp的连接数超出了服务器设置的连接数 1 2 3 4 5 6 [root@test log]# netstat -antp ...

  5. 状态管理Vuex的使用总结

    1.Vuex.store 的基本使用 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式,它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. Vu ...

  6. js点击获取—通过JS获取图片的相对坐标位置

    一.通过JS获取鼠标点击时图片的相对坐标位置 源代码如下所示: <!DOCTYPE html> <html lang="en"> <head> ...

  7. MapServer教程

    https://mapserver.org/ MapServer是一个开放源代码平台,用于将空间数据和交互式地图应用程序发布到Web.由OSGEO批准的MapServer项目指导委员会(PSC)负责管 ...

  8. ProxyImpl 类

    package com.test.mvp.mvpdemo.mvp.v7.proxy; import com.test.mvp.mvpdemo.mvp.v7.basemvp.BasePresenter; ...

  9. php面试专题---11、开发环境及配置考点

    php面试专题---11.开发环境及配置考点 一.总结 一句话总结: 了解php运行原理及常见的配置项 1.版本控制软件? 集中式:CVS和SVN 分布式:Git 2.请简述CGI.FastCGI和P ...

  10. PageObject设计模式 在selenium 自动化测试里面的应用

    PageObject设计模式1. Web自动化测试框架(WebTestFramework)是基于Selenium框架且采用PageObject设计模式进行二次开发形成的框架. 2. web测试时,建议 ...