SQLServer學習筆記 - 主鍵的理解
最近在學習SQLServer時,發現裡面有個主鍵的概念和作用總是模糊不清,因此上網去搜尋了一些主鍵的一些意義,加深一下理解
什麼是主鍵
按照百度百科的定義,主鍵(primary key)是資料表中的一個或多個欄位,其值用於唯一的標識表中的某一條記錄;在兩個表的關係中,主關鍵字用來在一個表中引用來自於另一個表的特定記錄;
(這段話有點抽象,看完了和沒看區別不大,且看下面的講解)
建立主鍵遵循的原則
(1)主鍵應當是對使用者沒有意義的,當使用者看到了一個表示多對多關係的連線表中的資料,並抱怨它沒有什麼用處,那麼證明表的主鍵設計很好;
(2)永遠不要更新主鍵,因此主鍵除了唯一的標識一行之外,沒有其他用處,如果需要更新,那麼主鍵對於使用者無意義的原則被違反了
注:這項原則在對於哪些經常需要在資料轉換或者多資料合併時進行資料整理的資料並不適用
(3)主鍵不應該包含動態變化的資料,如時間戳、時間列等
(4)主鍵應當由計算機自動生成
主鍵的特點
(1)一個表中只能有一個主鍵,如果在其他欄位上建立主鍵,則原來的主鍵就會取消
(2)主鍵的值不可以重複,也不可以為空
真正的主鍵理解
說了前面這麼多概念,現在以一個實際例子來說明主鍵
假設想建立一個學生資訊表,包含資訊如下:
create table StudentInfo
(
StudentId int prinamry key identity, -- 主鍵
StudentName varchar(20) not null, -- 唯一鍵
StudentGender char(2) not null,
StudentAddress varchar(500) not null,
StudentAccount varchar(100) unique
)
要求學生在使用學生登入系統時採用賬戶進行登入;
那麼如何去選擇主鍵呢?
可能從名字上來說,主鍵會被認為是十分重要的鍵,因此可能會說採用賬戶來做主鍵,這樣顯得有足夠的重要性;但是其實不然,從主鍵的選擇原則來看,主鍵就是需要選擇沒有太多意義且不會被改變的資料,而對於大部分來說,賬戶其實是可以進行更改的,那麼用賬戶來做主鍵就很不方便了
那麼什麼資料可以很好的標識一個學生,並且學生不能夠自由更改呢?並且該資料還可以和其他資料進行很好的關聯呢?
其實答案很明顯,那就是StudentId
StudentId對於實際來說基本是沒有意義的,因為其不可更改,並且僅僅是學生的一個編號,用來標識學生在學校裡的身份,因此用其作為主鍵可以標識學生的唯一性;除此之外,利用StudentId還可以很好的與其他資料表連線,如班級資訊,成績資訊,獲獎資訊等等;
唯一鍵
不知道你們有沒有注意到,在上述程式碼中,我將StudentAccount加了一個Unique約束,這表示唯一鍵約束,主要是用來防止資料重複,這樣的話就可以令學生註冊的賬戶都不一樣
總結
總的來說,主鍵就是一個對資料沒有較大意義,但是具有無重複性,可以唯一標識表中的每一條記錄,最簡單的例子就是我們們的身份證,標識了你這個人,選擇主鍵也儘量往這個原則上去選,並且,在SQL中,每張表都最好需要加上一個主鍵,這樣可以很好的建立資料關聯
相關文章
- batch normalization學習理解筆記BATORM筆記
- Javascript中的關鍵字'this'學習筆記JavaScript筆記
- Redis學習筆記(三)redis 的鍵管理Redis筆記
- 檢視SQLSERVER主鍵列SQLServer
- (學習筆記)python 對__init__的初步理解筆記Python
- Python學習筆記|Python之yield理解Python筆記
- spark學習筆記--RDD鍵對操作Spark筆記
- Linux學習筆記(一)--常用快捷鍵Linux筆記
- numpy的學習筆記\pandas學習筆記筆記
- Ansible 學習筆記 - 定位主機和組的模式筆記模式
- ElasticSearch學習筆記(二)——對聚合的簡單理解Elasticsearch筆記
- Redis學習筆記七:主從叢集Redis筆記
- 【學習筆記】CSS深入理解之margin筆記CSS
- 【學習筆記】CSS深入理解之overflow筆記CSS
- 【學習筆記】CSS深入理解之relative筆記CSS
- Mysql學習筆記-臨鍵鎖實驗MySql筆記
- AI學習筆記之——如何理解機器學習(Machine Learning)AI筆記機器學習Mac
- 《資料庫系統概論》5.0——常見約束 大學生學習筆記(主鍵 外來鍵)資料庫筆記
- sqlserver筆記2SQLServer筆記
- SQLSERVER 的主鍵索引真的是物理有序嗎?SQLServer索引
- XML學習筆記(一):關於字元編碼的理解XML筆記字元
- (Django)18.3建立網頁:學習筆記主頁Django網頁筆記
- 【學習筆記】make 和 new 關鍵字的區別筆記
- SqlServer主鍵和自增長設定SQLServer
- Nginx虛擬主機常用配置(學習筆記四)Nginx筆記
- NRF52832學習筆記(29)——主從一體筆記
- 【Prometheus學習筆記】主機監控 -node_exporterPrometheus筆記Export
- 【學習筆記】CSS深入理解之vertical-align筆記CSS
- 機器學習入門筆記——如何理解梯度下降機器學習筆記梯度
- OpenCV學習筆記(3)——Scalar資料型別理解OpenCV筆記資料型別
- .NET 5學習筆記(10)——Entity Framework Core之切換SQLServer和SQLite筆記FrameworkServerSQLite
- 棧的學習筆記筆記
- Cypress 的學習筆記筆記
- 學習筆記筆記
- PHP之Swoole 學習筆記-用做飯的方式來理解協程PHP筆記
- js--class類、super和estends關鍵詞的學習筆記JS筆記
- go lang學習筆記——channel機理及排程理解Go筆記
- swoole 學習筆記-做一頓飯來理解協程筆記