在mysql中,複合主鍵是指資料庫表的主鍵含有一個以上的欄位組成,即多欄位主鍵;複合主鍵是主鍵的一種,與主鍵具有相同的功能和定義。複合主鍵不能包含不必要的多餘列;當把複合主鍵的某一列刪除後,如果剩下的列構成的主鍵仍然滿足唯一性原則,那麼這個複合主鍵是不正確的。
本教學操作環境:windows7系統、mysql8版本、Dell G3電腦。
什麼是資料表的複合主鍵 ?
所謂的複合主鍵,就是指你表格的主鍵含有一個以上的欄位組成 。
MySQL多字段主鍵又可以成為複合主鍵。複合主鍵也是主鍵的一種與主鍵具有相同的功能和定義。
主鍵約束即在表中定義一個主鍵來唯一確定表中每一行資料的識別碼。主鍵可以是表中的某一列或多列的組合,其中由多列組合的主鍵稱為複合主鍵。
複合主鍵不能包含不必要的多餘列。當把複合主鍵的某一列刪除後,如果剩下的列構成的主鍵仍然滿足唯一性原則,那麼這個複合主鍵是不正確的。這是最小化原則。
例如:
create table test ( name varchar(19), id number, value varchar(10), primary key (name,id) )
上面的name和id欄位組合起來就是你test表的複合主鍵
它的出現是因為你的name欄位可能會出現重名,所以要加上ID欄位這樣就可以保證你記錄的唯一性
為什麼會出現複合主鍵
這是因為表name欄位可能出現重名的情況,所以要加上id字段來保證記錄的唯一性,而我們在開發中,主鍵字段數是保持一個是比較好的,非要創建兩個複合主鍵,那麼在創建表的時候就應該尋找一個能唯一性標識該物件的一個字段來識別。
那麼問題又來了,不是說一個表只能有一個主鍵嗎?主鍵是一個表的唯一索引啊,那麼為何一個表可以建立多個主鍵呢?
其實「主鍵是唯一的索引」這話有點歧義的,舉個例子說明:我們習慣性的在表中都會有一個id字段,設置為自動增長,並設置為主鍵,這時候"主鍵是唯一的索引",id自動增長保證來唯一性。此時,在建立一個欄位name varchar(50),也被設定為了主鍵,這時候id和name就成為了複合主鍵了,而表中的name欄位在插入資料時是可以插入相同的name值的,這時候又有問題了,不是說"主鍵是唯一索引嗎?怎麼能有相同的值?"
#所以說"主鍵是唯一性索引"是有歧義的;主鍵是唯一性索引的前提是"當表中只有一個主鍵時,它才是唯一的索引;當表中有多個主鍵時,稱為複合主鍵,複合主鍵聯合保證唯一性索引,即可理解為複合主鍵聯合起來成為了一個表的唯一性索引(主鍵)"。為什麼自增長ID已經可以作為唯一識別的主鍵,為啥還需要複合主鍵呢?因為,並不是所有的表都要有id這個字段啊,比如,我們建一個學生表,沒有唯一能標識學生的ID,怎麼辦呢?學生的名字、年齡、班級都可能重複,無法使用單一字段來唯一標識,這時,我們可以將多個字段設置為主鍵,形成複合主鍵,這多個字段聯合標識唯一性,其中,某幾個主鍵欄位值出現重複是沒有問題的,只要不是有多筆記錄的所有主鍵值完全一樣,就不算重複。
總結: 在開發中,主鍵字段數最好保持一個,非要創建兩個複合主鍵,那麼在創建表的時候就應該要尋找一個能唯一性標識該對象的一個字段來識別。簡而言之就是少用複合主鍵。
如何新增複合主鍵?
可以在建立表格時新增複合主鍵,此時主鍵由多個欄位聯合組成,語法規則如下:
PRIMARY KEY [字段1,字段2,…,字段n]
範例:建立資料表tb_emp,假設表中沒有主鍵id,為了唯一確定一個員工,可以把name、deptId 聯合起來當作主鍵
mysql> CREATE TABLE tb_emp -> ( -> name VARCHAR(25), -> deptId INT(11), -> salary FLOAT, -> PRIMARY KEY(id,deptId) -> ); Query OK, 0 rows affected (0.37 sec)
## 組合主鍵
########################## ####聯合主鍵和複合主鍵的差異在於:聯合主鍵體現在多個表上,複合主鍵體現在一個表中的多個欄位。 ###学生表: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影片教學】
#以上是mysql複合主鍵是什麼意思的詳細內容。更多資訊請關注PHP中文網其他相關文章!