博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
主键就是聚集索引吗
阅读量:4210 次
发布时间:2019-05-26

本文共 1417 字,大约阅读时间需要 4 分钟。

聚集索引:在表内排序和存储这些数据行。每个表只能有一个聚集索引,因为数据行本身只能按一个顺序存储。创建或重建聚集索引,会对硬盘中的数据重新排列

非聚集索引:非聚集索引具有完全独立于数据行的结构,使用非聚集索引不用将物理数据页的数据按列排序。非聚集索引包含索引键值和指向表数据存储位置的行定位器。
索引:聚集索引/非聚集索引/条件索引/唯一索引/在计算列上建索引,实现“函数索引”的功能
主键:唯一,非空,索引(唯一索引,聚集或者非聚集索引,默认聚集索引)
外键:非唯一,可以为null ,索引

主键就是聚集索引吗?

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

第一次尝试

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

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

复制代码

复制代码
--建立一张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中,主键的创建必须依赖于索引,默认创建的是聚集索引,这就解释了在上面的尝试中为什么表中已建立了聚集索引。

  可见,真的是我错了。

转载地址:http://dzrli.baihongyu.com/

你可能感兴趣的文章
QTP测试.NET控件CheckedListBox
查看>>
使用QTP的.NET插件扩展技术测试ComponentOne的ToolBar控件
查看>>
用上帝之眼进行自动化测试
查看>>
为LoadRunner写一个lr_save_float函数
查看>>
PrefTest工作室全新力作-《性能测试与调优实战》课程视频即将上线
查看>>
质量度量分析与测试技术 培训大纲
查看>>
欢迎加入【亿能测试快讯】邮件列表!
查看>>
为什么我们的自动化测试“要”这么难
查看>>
LoadRunner性能脚本开发实战训练
查看>>
测试之途,前途?钱途?图何?
查看>>
HP Sprinter:敏捷加速器
查看>>
单元测试培训PPT
查看>>
adb常用命令
查看>>
通过LR监控Linux服务器性能
查看>>
通过FTP服务的winsockes录制脚本
查看>>
LRwinsocket协议测试AAA服务器
查看>>
Net远程管理实验
查看>>
反病毒专家谈虚拟机技术 面临两大技术难题
查看>>
几种典型的反病毒技术:特征码技术、覆盖法技术等
查看>>
性能测试一般过程与LR性能测试过程
查看>>