前言

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

  难道我真的错了?

第一次尝试

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

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

--建立一张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 约束的强制执行。“

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

  

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

无法对表创建多个聚集索引。请在创建新聚集索引前删除现有的聚集索引的问题相关推荐

  1. mysql索引总结----mysql 索引类型以及创建

    文章归属:http://feiyan.info/16.html,我想自己去写了,但是发现此君总结的非常详细.直接搬过来了 关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基 ...

  2. MySQL索引类型及创建

    关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车.对于没有索引的表,单表查询可能几十万数据就是瓶颈,而通常大型 ...

  3. mysql索引总结_mysql 索引类型以及创建

    文章归属:http://feiyan.info/16.html  自己还是小白,从借鉴别人的东西开始学习. 关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基尼的话,那么没 ...

  4. MySQL索引的查看创建和删除

    1.索引作用 在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率.特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍. 例如,有 ...

  5. mysql如何创建简单索引_mysql 如何创建索引呢,这个其实很简单

    mysql 如何创建索引? mysql 如何创建索引呢,这个其实很简单 create index或者为己有字段增加索引 ALTER TABLE `table_name` ADD UNIQUE (`co ...

  6. mysql建立索引的优缺点|创建索引alter或create索引分类(PRIMARY KEY,UNIQUE KEY,FULLTEXT,INDEX)作用查看索引show index from table

    建立索引的优缺点: 为什么要创建索引呢? 这是因为,创建索引可以大大提高系统的性能.          第一.通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性.          第二.可以大 ...

  7. MySQL索引、视图创建与管理操作实验

    实验4:索引.视图创建与管理操作实验 一.实验目的: 理解索引的概念与类型. 掌握创建.更改.删除索引的方法. 掌握维护索引的方法. 理解视图的概念. 掌握创建.更改.删除视图的方法. 掌握使用视图来 ...

  8. mysql修改索引语句_mysql——创建索引、修改索引、删除索引的命令语句

    查看表中已经存在 index:show index from table_name; 创建和删除索引索引的创建可以在CREATE TABLE语句中进行,也可以单独用CREATE INDEX或ALTER ...

  9. mysql 创建索引失败_mysql创建多列索引及优化 - 没有所谓的失败!除非你不再尝试! - PHPChina ......

    什么是索引? 索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录.表里面 ...

最新文章

  1. 天龙源码分析 - 选择角色流程
  2. less新手入门(四)—— Mixin Guards
  3. gl.getAttribLocation P41 获取name参数指定的attribute变量存储地址
  4. 七牛云——对象存储私有空间下载凭证认证失败401[“error“:“download token auth failed“]解决方案
  5. C语言插入排序Insertion Sort算法(附完整源码)
  6. 解决GitLab中使用SSH的git clone总是提示输入密码且任何密码都不对
  7. 东北天到ecef的变换_GNSS学习笔记-坐标转换
  8. MySQL数据以全量和增量方式,向ES搜索引擎同步流程
  9. SAP License:飘在SAP日子之二-售前的产生与发展
  10. .Net之路(四)利用DataTable、DataSet返回SQL Server的表或者单个字段
  11. 教你定时爬取微博热搜榜并做动态数据展示,让你不错过任何一个吃瓜热点
  12. php大文件去重,详细解说PHP多个进程配合redis的有序集合实现大文件去重
  13. 扩展lucas学习笔记
  14. Mathmatica可视化
  15. 关于时间复杂度的详解
  16. C#几种读取文件的方式
  17. 阿里云后台测试短信模板
  18. Android Debug Bridge(adb)
  19. 【计算机网络实验】动态路由协议——华为eNSP(详细实验报告+代码)
  20. wifi网络信息查看

热门文章

  1. 物联网测试地图(译)
  2. 微信小程序正则表达式截取_微信小程序之正则表达式
  3. 怎么选择EDIUS和VEGAS
  4. 计算机策略中封运行程序,使用组策略封禁IP地址的方法
  5. Typora+PicGo+又拍云实现图片快速上传的两种方法
  6. qemu启动OrangePi PC u-boot
  7. **深度学习 BN 、LeakyReLU算法原理
  8. 微服务:MQClientException: No route info of this topic, mytopic 报错解决
  9. 苹果ipnone 6s Taptic Engine测试
  10. c语言许愿树编程,许愿树(五)