復合主鍵與聯合主鍵

2021-08-15 19:36:56 字數 1569 閱讀 5382

一、復合主鍵

所謂的復合主鍵 就是指你表的主鍵含有乙個以上的字段組成,不使用無業務含義的自增id作為主鍵。

比如[html] view plain copy

create table test   

(

name varchar(19),

id number,

value varchar(10),

primary key (name,id)

)

上面的name和id欄位組合起來就是你test表的復合主鍵 ,它的出現是因為你的name欄位可能會出現重名,所以要加上id欄位這樣就可以保證你記錄的唯一性 ,一般情況下,主鍵的字段長度和字段數目要越少越好 。

這裡就會有乙個疑惑? 主鍵是唯一的索引,那麼為何乙個表可以建立多個主鍵呢?

其實「主鍵是唯一的索引」這話有點歧義的。舉個例子,我們在表中建立了乙個id欄位,自動增長,並設為主鍵,這個是沒有問題的,因為「主鍵是唯一的索引」,id自動增長保證了唯一性,所以可以。

此時,我們再建立乙個欄位name,型別為varchar,也設定為主鍵,你會發現,在表的多行中你是可以填寫相同的name值的,這豈不是有違「主鍵是唯一的索引」這句話麼?

所以我才說「主鍵是唯一的索引」是有歧義的。應該是「當表中只有乙個主鍵時,它是唯一的索引;當表中有多個主鍵時,稱為復合主鍵,復合主鍵聯合保證唯一索引」。

為什麼自增長id已經可以作為唯一標識的主鍵,為啥還需要復合主鍵呢。因為,並不是所有的表都要有id這個字段,比如,我們建乙個學生表,沒有唯一能標識學生的id,怎麼辦呢,學生的名字、年齡、班級都可能重複,無法使用單個欄位來唯一標識,這時,我們可以將多個字段設定為主鍵,形成復合主鍵,這多個字段聯合標識唯一性,其中,某幾個主鍵字段值出現重複是沒有問題的,只要不是有多條記錄的所有主鍵值完全一樣,就不算重複。

二、聯合主鍵

聯合主鍵顧名思義就是多個主鍵聯合形成乙個主鍵組合(主鍵原則上是唯一的,別被唯一值所困擾。)  

聯合主鍵的意義:用2個字段(或者多個字段,後面具體都是用2個字段組合)來確定一條記錄,說明,這2個字段都不是唯一的,2個字段可以分別重複,這麼設定的好處,可以很直觀的看到某個重複欄位的記錄條數。

乙個簡單的例子

主鍵a跟主鍵b組成聯合主鍵

主鍵a跟主鍵b的資料可以完全相同,聯合就在於主鍵a跟主鍵b形成的聯合主鍵是唯一的。

下例主鍵a資料是1,主鍵b資料也是1,聯合主鍵其實是11,這個11是唯一值,絕對不充許再出現11這個唯一值。(這就是多對多關係)

主鍵a資料 主鍵b資料

1      1

2      2

3      3

主鍵a與主鍵b的聯合主鍵值最多也就是

1112

1321

2223

3132

33總結: 以我來看復合主鍵就是含有乙個以上的字段組成,如id+name,id+phone等,而聯合主鍵要同時是兩個表的主題組合起來的。這是和復合主鍵最大的區別!

復合主鍵與聯合主鍵

含義 表的主鍵含有乙個以上的字段組成,不使用無業務含義的自增id作為主鍵。比如 create table test namevarchar 19 idnumber,valuevarchar 10 primarykey name,id 上面的name和id欄位組合起來就是你test表的復合主鍵 它的出...

MySql 復合主鍵與聯合主鍵

復合主鍵 資料庫表的主鍵由兩個及以上的字段組成。create table asm device config info asmmodel varchar 32 not null comment 自助機型號 devicetype varchar 32 not null comment 外設型別 dev...

聯合主鍵和復合主鍵

聯合主鍵其實就是中間表。在多對多模型裡,需要兩個表中的主鍵組成聯合主鍵,這樣就可以查到兩個表中的每個資料。建立team表 create table team id mediumint auto increment comment team 主鍵 name varchar 10 comment tea...