zoukankan      html  css  js  c++  java
  • 主键就必须是聚集索引

    主键就是聚集索引吗?

    前言

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

      难道我真的错了?

    第一次尝试

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

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

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

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

      

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

    选择比努力更重要。亡羊补牢,穷则思变比后悔抱怨更有价值。脚踏实地,讲究而不将就。人生路还长,暂时的错误不是终点,不思进取、甘于现状才是你人生的死穴。
  • 相关阅读:
    228. Summary Ranges
    227. Basic Calculator II
    224. Basic Calculator
    222. Count Complete Tree Nodes
    223. Rectangle Area
    221. Maximal Square
    220. Contains Duplicate III
    219. Contains Duplicate II
    217. Contains Duplicate
    Java编程思想 4th 第4章 控制执行流程
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/10418954.html
Copyright © 2011-2022 走看看