主鍵就是聚集索引嗎?

来源:http://www.cnblogs.com/lj820403/archive/2017/07/27/7246657.html
-Advertisement-
Play Games

前言 最近在一次面試中,討論了一個這樣的問題:主鍵和索引有什麼區別?當時我的回答是這樣的:“主鍵就是加了唯一性約束的聚集索引。” “你確定你所說的是對的?” 面試官反問到。 “應該是對的。” 我不加思索地回答道。 “你回去後研究一下這個問題吧。” 難道我真的錯了? 第一次嘗試 當問題出現時,請用事實 ...


前言

  最近在一次面試中,討論了一個這樣的問題:主鍵和索引有什麼區別?當時我的回答是這樣的:“主鍵就是加了唯一性約束的聚集索引。” “你確定你所說的是對的?” 面試官反問到。 “應該是對的。” 我不加思索地回答道。 “你回去後研究一下這個問題吧。”

  難道我真的錯了?

第一次嘗試

  當問題出現時,請用事實支持你的觀點。

  首先,必須瞭解一些基本知識:對於一張表來說,聚集索引只能有一個,因為數據真實的物理存儲順序就是按照聚集索引存儲的。基於這個原理,現在可以用這樣的方案來測試:對一張表設置一個主鍵, 之後再建立一個聚集索引,假如聚集索引能創建成功, 表明主鍵就不是聚集索引, 如果不可以建立聚集索引,就表明主鍵是聚集索引。

複製代碼
--建立一張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 約束的強制執行。“

  如果對索引執行強制刪除的話,如下圖操作:

  

  結果是可以刪除的,但主鍵也會被跟著一起刪除,所以主鍵必須依賴於索引的觀點暫時是正確的。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • SQL Server 中數據存儲的基本單位是頁。為資料庫中的數據文件(.mdf 或 .ndf)分配的磁碟空間可以從邏輯上劃分成頁(從 0 到 n 連續編號)。磁碟 I/O 操作在頁級執行。也就是說,SQL Server 讀取或寫入所有數據頁。 區是八個物理上連續的頁的集合,用來有效地管理頁。所有頁都 ...
  • 目錄 · 概況 · 原理 · 資源調度器分類 · YARN架構 · ResourceManager · NodeManager · ApplicationMaster · Container · YARN工作流程 · YARN資源調度 · 操作 · Overview · User Commands ...
  • 目錄 · 概況 · 原理 · HDFS 架構 · 塊 · NameNode · SecondaryNameNode · fsimage與edits合併 · DataNode · 數據讀寫 · 容錯機制 · 數據完整性 · NameNode HA · NameNode Federation · HDF ...
  • 1. mysql是一種常用的資料庫管理軟體,優點有:免費,開源,跨平臺,本文只是介紹一下MySQL的簡單操作 2.資料庫的基本結構 可以把資料庫理解成一個文件夾,資料庫中的數據存放的單位是表,可以理解為excel表格,表格的表頭稱為欄位,表中的每一條數據稱為記錄 3.MySQL安裝 1.從官網下載  ...
  • SQLite doesn't support high concurrency. In case of a lot of concurrent access from multi-process or multi-thread, calling a SQLite r/w function is pr ...
  • 一、視圖的定義 視圖也稱為虛表,視圖本身不占用物理存儲空間,視圖存放於數據字典中,簡單的來說視圖可以看做是sql語句的集合。視圖從資料庫中的表產生,這些表稱為視圖的基表,一個視圖可以從另一個視圖中產生。 視圖看上去非常象資料庫的物理表,對它的操作同任何其它的表一樣。當通過視圖修改數據時,實際上是在改 ...
  • 本文介紹了MySQL Cluster的概念和架構,並通過幾個實例詳細討論了Cluster的配置方法,啟動關閉,常用維護方法的概念。 ...
  • 關於Apache Spark "Why Apache Spark" "關於Apache Spark" "如何安裝Apache Spark" " Apache Spark的工作原理" "spark彈性分散式數據集" "RDD持久性" "spark共用變數" "Spark SQL" "Spark Str ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...