MySQL中關(guān)于超鍵和主鍵及候選鍵的區(qū)別
關(guān)于超鍵和主鍵及候選鍵的區(qū)別
最近在看MySQL的書(shū)時(shí)遇到了一個(gè)問(wèn)題:
既然已經(jīng)有了主鍵這個(gè)概念,主鍵已經(jīng)能夠滿(mǎn)足需求了,那為什么還要有候選鍵這種東西?候選鍵的作用是什么呢?給了它一個(gè)候選鍵的定義但是它真的并沒(méi)有什么亂用。
抱著刨根問(wèn)底攔不住的心態(tài)我去網(wǎng)上搜了搜,看了看大神們的解釋?zhuān)吹梦疫€是有些懵懂,于是想在這里梳理一下,幫助自己理解的更通透,也希望如果有理解錯(cuò)的地方能有人指點(diǎn)一下 下面就是我的一些理解:
其實(shí)主鍵和超鍵還好一些,比如有這么一個(gè)表:
表寫(xiě)的有些糙,湊合看吧。
超鍵
在關(guān)系中能唯一標(biāo)識(shí)元組的屬性集稱(chēng)為關(guān)系模式的超鍵。 注定義中的“屬性集”,超鍵可以是一個(gè)很大的集合,只要他能確定是哪一行就行,因此’id’,‘user’,‘pwd’,‘section’,'name’都可以是超鍵的集。
候選鍵
不含有多余屬性的超鍵,比如在上面的超鍵中,'id’自己就可以獨(dú)自確定是哪一行,所以他自己可以是一個(gè)候選鍵,除去它以外的另外四個(gè)也可以是候選鍵,但是這五個(gè)放在一起因?yàn)橛辛硕嘤嗟牧校麄兙筒皇呛蜻x鍵。(另外四個(gè)可以是候選鍵的原因是每一列都有可能有重復(fù)的內(nèi)容)
主鍵
在所有的候選鍵里面找一個(gè)作為主鍵供使用,也就是說(shuō)可以是id,也可以是另外四個(gè)的合體,也有可能是其他的選擇,只要能保證選擇的集合能唯一確定即可。
總結(jié)來(lái)說(shuō),候選鍵是超鍵的子集,主鍵是候選鍵的子集。
其實(shí)整理了這么多以后我還是不明白候選鍵的作用到底是什么,其實(shí)他可能就是作為一個(gè)候車(chē)廳一樣,車(chē)上只剩下一個(gè)座位,有幾個(gè)主鍵在候車(chē)廳里坐著,告訴你:“我們幾個(gè)人都買(mǎi)票了,都有資格上車(chē),你選誰(shuí)上,我們誰(shuí)就跟你去上車(chē)”,應(yīng)該就是這樣。
理解超鍵、候選鍵、主鍵概念及關(guān)系
基本概念
- 超鍵(super key):在關(guān)系中能唯一標(biāo)識(shí)元組的屬性集稱(chēng)為關(guān)系模式的超鍵/碼。
- 候選鍵(candidate key):不含有多余屬性的超鍵稱(chēng)為候選鍵,即其真子集不再是超鍵。
- 主鍵(primary key):用戶(hù)選作元組標(biāo)識(shí)的一個(gè)候選鍵稱(chēng)為主鍵,是候選鍵之一。
關(guān)系
候選鍵是超鍵的子集,主鍵是候選鍵中的一個(gè)。
舉個(gè)栗子
考慮屬性集(身份證號(hào),姓名 ,性別 ,年齡),假設(shè)無(wú)重名
a.其中超鍵有:
- 身份證號(hào)、姓名、(姓名,性別)、(姓名,性別,年齡)等
- --這里可以看出,超鍵是能唯一確定一個(gè)人的屬性組
b.超鍵中的候選鍵
- 身份證號(hào)、姓名唯一,而且沒(méi)有多余屬性,所以是一個(gè)候選鍵
- --這里可以看出,候選鍵是沒(méi)有多余屬性的超鍵
c.選擇主鍵
- 用戶(hù)可根據(jù)自己喜好考慮選擇姓名或者身份證號(hào)作為主鍵
- --主鍵是選中的一個(gè)候選鍵
還不明白?
實(shí)例:
在SQL Server數(shù)據(jù)庫(kù)中,有一個(gè)學(xué)生信息表如下所示,在該表中不能作為候選鍵的屬性集合為( ) (選擇一項(xiàng))
學(xué)號(hào) 姓名 性別 年齡 系別 專(zhuān)業(yè)
20020612 李輝 男 20 計(jì)算機(jī) 軟件開(kāi)發(fā)
20060613 張明 男 18 計(jì)算機(jī) 軟件開(kāi)發(fā)
20060614 王小玉 女 19 物理 力學(xué)
20060615 李淑華 女 17 生物 動(dòng)物學(xué)
20060616 趙靜 男 21 化學(xué) 食品化學(xué)
20060617 趙靜 女 20 生物 植物學(xué)
a){學(xué)號(hào)}
b){學(xué)號(hào)、姓名}
c){年齡、系別}
d){姓名、性別}
e){姓名、專(zhuān)業(yè)}
如果大家還不知道如何來(lái)選擇,再看看基本概念吧!
嗯,不會(huì)的就選C吧,哈哈哈哈哈哈
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于MySQL 大批量插入時(shí)如何過(guò)濾掉重復(fù)數(shù)據(jù)
這篇文章主要介紹關(guān)于MySQL 大批量插入時(shí)如何過(guò)濾重復(fù)數(shù)據(jù),比如線(xiàn)上庫(kù)有6個(gè)表存在重復(fù)數(shù)據(jù),其中2個(gè)表比較大,96萬(wàn)+和30萬(wàn)+,因?yàn)橹疤幚磉^(guò)相同的問(wèn)題,就直接拿來(lái)了上次的Python去重腳本,腳本很簡(jiǎn)單,就是連接數(shù)據(jù)庫(kù),查出來(lái)重復(fù)數(shù)據(jù),循環(huán)刪除,需要的朋友可以參考下2021-09-09Mysql查詢(xún)語(yǔ)句詳細(xì)總結(jié)大全
這篇文章主要給大家介紹了關(guān)于Mysql查詢(xún)語(yǔ)句詳細(xì)總結(jié)的相關(guān)資料,MySQL是一種關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),它支持SQL語(yǔ)言進(jìn)行數(shù)據(jù)查詢(xún),文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12MySQL一個(gè)語(yǔ)句查出各種整形占用字節(jié)數(shù)及最大最小值的實(shí)例
下面小編就為大家?guī)?lái)一篇MySQL一個(gè)語(yǔ)句查出各種整形占用字節(jié)數(shù)及最大最小值的實(shí)例。2017-03-03Win10 64位使用壓縮包安裝最新MySQL8.0.18的教程(圖文詳解)
本文通過(guò)圖文并茂的形式給大家介紹了WIN10 64位使用壓縮包安裝最新MySQL8.0.18的教程,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12Python MySQL進(jìn)行數(shù)據(jù)庫(kù)表變更和查詢(xún)
這篇文章主要介紹了Python MySQL進(jìn)行數(shù)據(jù)庫(kù)表變更和查詢(xún)的相關(guān)資料,需要的朋友可以參考下2017-05-05MYSQL 5.6 從庫(kù)復(fù)制的部署和監(jiān)控的實(shí)現(xiàn)
這篇文章主要介紹了MYSQL 5.6 從庫(kù)復(fù)制的部署和監(jiān)控的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12MySQL高級(jí)特性——數(shù)據(jù)表分區(qū)的概念及機(jī)制詳解
當(dāng)數(shù)據(jù)表過(guò)大時(shí),通過(guò)普通的查詢(xún)優(yōu)化技巧已經(jīng)無(wú)法大幅度提升性能,此時(shí)往往需要進(jìn)行分區(qū)分表優(yōu)化。分區(qū)其實(shí)是將一張邏輯上統(tǒng)一的表在物理上劃分成了多張表。分區(qū)操作對(duì)使用者而言是一個(gè)黑盒操作,但是如果你從文件系統(tǒng)上看,就會(huì)看到分區(qū)數(shù)據(jù)表的實(shí)際存儲(chǔ)方式是分開(kāi)的。2021-05-05mysql踩坑之count distinct多列問(wèn)題
這篇文章主要介紹了mysql踩坑之count distinct多列問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03MAC系統(tǒng)中添加MYSQL開(kāi)機(jī)啟動(dòng)的方法
這篇文章主要介紹了MAC系統(tǒng)中添加MYSQL開(kāi)機(jī)啟動(dòng)的方法,本文簡(jiǎn)潔易懂,步驟清晰,需要的朋友可以參考下2014-11-11