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