MySql的复合主键和联合主键的介绍
我的個(gè)人博客
百度搜索:【迷你酷吧】網(wǎng)址:https://www.minikuba.com,迷你酷吧是一個(gè)基于程序員經(jīng)驗(yàn)為基礎(chǔ)分享技術(shù)文章、算法解題、大廠面試真題、熱門項(xiàng)目的平臺(tái),致力于為大家提供更多涵蓋前后端技術(shù)、技能的學(xué)習(xí),助力廣大熱衷編程開發(fā)者全面發(fā)展。本文章鏈接https://www.minikuba.com/article/126
復(fù)合主鍵
CREATE TABLE stu_detail( id INT NOT NULL AUTO_INCREMENT, age INT COMMENT '學(xué)生年齡', address VARCHAR(50) COMMENT '學(xué)生住址', phone CHAR(11) NOT NULL COMMENT '學(xué)生號(hào)碼', cid INT NOT NULL, PRIMARY KEY (id,address) );復(fù)合主鍵是指數(shù)據(jù)庫表的主鍵含有一個(gè)以上的字段組成。例如上面的表就是創(chuàng)建了復(fù)合主鍵,表中的id和name字段組合起來就是表course的復(fù)合主鍵,為什么會(huì)出現(xiàn)復(fù)合主鍵,這是因?yàn)楸韓ame字段可能出現(xiàn)重名的情況,所以要加上id字段來保證記錄的唯一性,而我們?cè)陂_發(fā)中,主鍵字段數(shù)是保持一個(gè)是比較好的,非要?jiǎng)?chuàng)建兩個(gè)復(fù)合主鍵,那么在創(chuàng)建表的時(shí)候就應(yīng)該尋找一個(gè)能唯一性標(biāo)識(shí)該對(duì)象的一個(gè)字段來識(shí)別。
那么問題又來了,不是說一個(gè)表只能有一個(gè)主鍵嗎?主鍵是一個(gè)表的唯一索引啊,那么為何一個(gè)表可以創(chuàng)建多個(gè)主鍵呢?
其實(shí)“主鍵是唯一的索引”這話有點(diǎn)歧義的,舉個(gè)例子說明:我們習(xí)慣性的在表中都會(huì)有一個(gè)id字段,設(shè)置為自動(dòng)增長(zhǎng),并設(shè)置為主鍵,這時(shí)候"主鍵是唯一的索引",id自動(dòng)增長(zhǎng)保證來唯一性。此時(shí),在創(chuàng)建一個(gè)字段name varchar(50),也被設(shè)置為了主鍵,這時(shí)候id和name就成為了復(fù)合主鍵了,而表中的name字段在插入數(shù)據(jù)時(shí)是可以插入相同的name值的,這時(shí)候又有問題了,不是說"主鍵是唯一索引嗎?怎么能有相同的值?"
所以說"主鍵是唯一性索引"是有歧義的;主鍵是唯一性索引的前提是"當(dāng)表中只有一個(gè)主鍵時(shí),它才是唯一的索引;當(dāng)表中有多個(gè)主鍵時(shí),稱為復(fù)合主鍵,復(fù)合主鍵聯(lián)合保證唯一性索引,即可理解為復(fù)合主鍵聯(lián)合起來成為了一個(gè)表的唯一性索引(主鍵)"。為什么自增長(zhǎng)ID已經(jīng)可以作為唯一標(biāo)識(shí)的主鍵,為啥還需要復(fù)合主鍵呢?因?yàn)?#xff0c;并不是所有的表都要有id這個(gè)字段啊,比如,我們建一個(gè)學(xué)生表,沒有唯一能標(biāo)識(shí)學(xué)生的ID,怎么辦呢?學(xué)生的名字、年齡、班級(jí)都可能重復(fù),無法使用單個(gè)字段來唯一標(biāo)識(shí),這時(shí),我們可以將多個(gè)字段設(shè)置為主鍵,形成復(fù)合主鍵,這多個(gè)字段聯(lián)合標(biāo)識(shí)唯一性,其中,某幾個(gè)主鍵字段值出現(xiàn)重復(fù)是沒有問題的,只要不是有多條記錄的所有主鍵值完全一樣,就不算重復(fù)。
總結(jié): 在開發(fā)中,主鍵字段數(shù)最好保持一個(gè),非要?jiǎng)?chuàng)建兩個(gè)復(fù)合主鍵,那么在創(chuàng)建表的時(shí)候就應(yīng)該要尋找一個(gè)能唯一性標(biāo)識(shí)該對(duì)象的一個(gè)字段來識(shí)別。簡(jiǎn)而言之就是少用復(fù)合主鍵。
聯(lián)合主鍵
聯(lián)合主鍵和復(fù)合主鍵的區(qū)別在于:聯(lián)合主鍵體現(xiàn)在多個(gè)表上,復(fù)合主鍵體現(xiàn)在一個(gè)表中的多個(gè)字段。
學(xué)生表:student create table student( id int auto_increment comment '主鍵id', name varchar(30) comment '姓名', age smallint comment '年齡', primary key(id) );課程表:course create table course( id int auto_increment comment '主鍵id', name varchar(30) comment '課程名稱', primary key(id) );學(xué)生課程表:stu_course create table IF NOT EXISTS stu_cour( id int auto_increment comment '主鍵id', stu_id mediumint comment '學(xué)生表id', cour_id mediumint comment '課程表id', primary key(id) );此時(shí)stu_course中id就表示聯(lián)合主鍵,通過id可以獲取學(xué)生和課程的一條記錄
所以聯(lián)合主鍵,顧名思義就是多個(gè)主鍵聯(lián)合形成一個(gè)主鍵組合,體現(xiàn)在聯(lián)合。 (主鍵原則上是唯一的,別被唯一值所困擾) 索引可以極大的提高數(shù)據(jù)的查詢速度,但是會(huì)降低插入、刪除、更新表的速度,因?yàn)樵趫?zhí)行這些寫操作時(shí),還要操作索引文件。 簡(jiǎn)單的例子 主鍵A跟主鍵B組成聯(lián)合主鍵C,主鍵A跟主鍵B的數(shù)據(jù)可以完全相同,聯(lián)合就在于主鍵A跟主鍵B形成的聯(lián)合主鍵C是唯一的。
總結(jié)
以上是生活随笔為你收集整理的MySql的复合主键和联合主键的介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。