文档章节

主键就是聚集索引吗?

o
 osc_z1hvg4cu
发布于 2018/04/24 12:27
字数 816
阅读 8
收藏 0

钉钉、微博极速扩容黑科技,点击观看阿里云弹性计算年度发布会!>>>

前言

  最近在一次面试中,讨论了一个这样的问题:主键和索引有什么区别?当时我的回答是这样的:“主键就是加了唯一性约束的聚集索引。” “你确定你所说的是对的?” 面试官反问到。 “应该是对的。” 我不加思索地回答道。 “你回去后研究一下这个问题吧。”

  难道我真的错了?

第一次尝试

  当问题出现时,请用事实支持你的观点。

  首先,必须了解一些基本知识:对于一张表来说,聚集索引只能有一个,因为数据真实的物理存储顺序就是按照聚集索引存储的。基于这个原理,现在可以用这样的方案来测试:对一张表设置一个主键, 之后再建立一个聚集索引,假如聚集索引能创建成功, 表明主键就不是聚集索引, 如果不可以建立聚集索引,就表明主键是聚集索引。

复制代码
--建立一张TABLE 同时设置主键
CREATE TABLE student
(    
    stud_id  INT IDENTITY(1,1) NOT NULL,
    stud_name NVARCHAR(50) NOT NULL,    
    CONSTRAINT pk_student PRIMARY KEY(stud_id)    
);
复制代码

  接下来就尝试对这张表建立一个聚集索引吧。

CREATE CLUSTERED INDEX index_stud_name ON student(stud_name);

  执行这条语句的时候,SQLServer的消息框弹出了这样的处理信息:“无法对 表 'student' 创建多个聚集索引。请在创建新聚集索引前删除现有的聚集索引 'pk_student'。"

  是不是我已经胜出了?

进一步思考

  很大程度上,我应该对上述结果感到很满意的。但谨慎的思维提醒我:会不会自己遗漏了什么东西?

  来看一下关于主键的定义吧,主键是表中的一个字段或多个字段,用来唯一地标识表中的一条记录。唯一性是主键最主要的特性。在查阅建立主键的方法的时候, 一个之前被我完全忽略的创建方式突然出现在我的眼前, 在建立主键的时候可以声明为CLUETERED(聚集)或NONCLUETERED(非聚集)!也就是说主键也可以声明为非聚集索引,如下:

复制代码
CREATE TABLE student
(
    stud_id INT IDENTITY(1,1) NOT NULL,
    stud_name NVARCHAR(20) NOT NULL,
    CONSTRAINT pk_student PRIMARY KEY NONCLUSTERED (stud_id)
);
复制代码

  在SQLServer中,主键的创建必须依赖于索引,默认创建的是聚集索引,这就解释了在上面的尝试中为什么表中已建立了聚集索引。

  可见,真的是我错了。

后续

  园子里的朋友提到一个观点,就是跟着主键而创建的索引可以被单独删除,经我测试过,这是不可以的。

--执行删除索引语句
DROP INDEX pk_student ON student

  SQLServer的消息框会弹出这样的提示信息:”不允许对索引 'student.pk_student' 显式地使用 DROP INDEX。该索引正用于 PRIMARY KEY 约束的强制执行。“

  如果对索引执行强制删除的话,如下图操作:

  

  结果是可以删除的,但主键也会被跟着一起删除,所以主键必须依赖于索引的观点暂时是正确的。

参考:主键就是聚集索引吗?

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
【SqlServer】聚集索引与主键、非聚集索引

目录结构: contents structure [-] 聚集索引和非聚集索引的区别 聚集索引和主键的区别 主键和(非)聚集索引的常规操作 聚集索引、非聚集索引在SqlServer、MySQL、Oracle...等数据库中都有这个...

osc_0jg1hma8
2018/02/25
4
0
主键就必须是聚集索引

主键就是聚集索引吗? 前言   最近在一次面试中,讨论了一个这样的问题:主键和索引有什么区别?当时我的回答是这样的:“主键就是加了唯一性约束的聚集索引。” “你确定你所说的是对的?...

osc_b1y21l0d
2019/02/22
2
0
SQL聚集索引和非聚集索引的区别

其中的两个区别: 聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个,这个跟没问题没差别,一般人都知道。 聚集索引存储记录是物理上连续存在,而非聚集索引是逻辑上的连续,物理存...

Zhao-Qian
2012/08/20
226
0
主键索引就是聚集索引吗?

这个问题很刁钻! 答案是错的。 的确在mysql数据库innodb引擎里面,主键的确就是聚集索引。 但是myisam引擎里面主键也不是聚集索引。 另外在sql server中还可以显示的指定聚集索引。 CREATE...

osc_9rkv1ihi
2019/09/22
1
0
[MySQL] 为什么要给表加上主键

1.一个没加主键的表,它的数据无序的放置在磁盘存储器上,一行一行的排列的很整齐. 2.一个加了主键的表,并不能被称之为「表」。如果给表上了主键,那么表在磁盘上的存储结构就由整齐排列的结构...

osc_575sntwo
2019/07/29
2
0

没有更多内容

加载失败,请刷新页面

加载更多

OpenCV开发笔记(六十七):红胖子8分钟带你深入了解特征点暴力匹配(图文并茂+浅显易懂+程序源码)

若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.csdn.net/qq21497936 原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062 本文章博客地址:h...

红模仿_红胖子
45分钟前
24
0
将向量附加到向量[重复] - Appending a vector to a vector [duplicate]

问题: This question already has an answer here: 这个问题已经在这里有了答案: Concatenating two std::vectors 22 answers 连接两个std :: vectors 22个答案 Assuming I have 2 standa......

javail
47分钟前
19
0
获得所有文件夹的大小

有两个工具 https://www.getfoldersize.com/ http://www.uderzo.it/main_products/space_sniffer/index.html...

ethanleellj
今天
18
0
interactjs 拖拽 缩放 的交互库

只提供事件钩子和数据, 并不会直接修改dom, 需要自己手动根据数据修改样式 拖拽并记录移动的位置 <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</t......

阿豪boy
今天
19
0
为什么在iOS7中,UITableView顶部的UITableViewStyleGrouped样式具有额外的填充

问题: Starting in iOS7, there is additional space at the top of my UITableView 's which have a style UITableViewStyleGrouped . 从iOS7开始,我的UITableView顶部还有一个额外的空间......

fyin1314
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部