溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

mysql復(fù)合主鍵指的是什么意思

發(fā)布時間:2023-03-30 11:06:57 來源:億速云 閱讀:140 作者:iii 欄目:MySQL數(shù)據(jù)庫

本篇內(nèi)容介紹了“mysql復(fù)合主鍵指的是什么意思”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

在mysql中,復(fù)合主鍵是指數(shù)據(jù)庫表的主鍵含有一個以上的字段組成,即多字段主鍵;復(fù)合主鍵是主鍵的一種,與主鍵具有相同的功能和定義。復(fù)合主鍵不能包含不必要的多余列;當把復(fù)合主鍵的某一列刪除后,如果剩下的列構(gòu)成的主鍵仍然滿足唯一性原則,那么這個復(fù)合主鍵是不正確的。

什么是數(shù)據(jù)表的復(fù)合主鍵 ?

所謂的復(fù)合主鍵,就是指你表的主鍵含有一個以上的字段組成 。

MySQL多字段主鍵又可以成為復(fù)合主鍵。復(fù)合主鍵也是主鍵的一種與主鍵具有相同的功能和定義。

主鍵約束即在表中定義一個主鍵來唯一確定表中每一行數(shù)據(jù)的標識符。主鍵可以是表中的某一列或者多列的組合,其中由多列組合的主鍵稱為復(fù)合主鍵。

復(fù)合主鍵不能包含不必要的多余列。當把復(fù)合主鍵的某一列刪除后,如果剩下的列構(gòu)成的主鍵仍然滿足唯一性原則,那么這個復(fù)合主鍵是不正確的。這是最小化原則。

例如:

create table test
(
name varchar(19),
id number,
value varchar(10),
primary key (name,id)
)

上面的name和id字段組合起來就是你test表的復(fù)合主鍵

它的出現(xiàn)是因為你的name字段可能會出現(xiàn)重名,所以要加上ID字段這樣就可以保證你記錄的唯一性

為什么會出現(xiàn)復(fù)合主鍵

這是因為表name字段可能出現(xiàn)重名的情況,所以要加上id字段來保證記錄的唯一性,而我們在開發(fā)中,主鍵字段數(shù)是保持一個是比較好的,非要創(chuàng)建兩個復(fù)合主鍵,那么在創(chuàng)建表的時候就應(yīng)該尋找一個能唯一性標識該對象的一個字段來識別。

那么問題又來了,不是說一個表只能有一個主鍵嗎?主鍵是一個表的唯一索引啊,那么為何一個表可以創(chuàng)建多個主鍵呢?

其實“主鍵是唯一的索引”這話有點歧義的,舉個例子說明:我們習(xí)慣性的在表中都會有一個id字段,設(shè)置為自動增長,并設(shè)置為主鍵,這時候"主鍵是唯一的索引",id自動增長保證來唯一性。此時,在創(chuàng)建一個字段name varchar(50),也被設(shè)置為了主鍵,這時候id和name就成為了復(fù)合主鍵了,而表中的name字段在插入數(shù)據(jù)時是可以插入相同的name值的,這時候又有問題了,不是說"主鍵是唯一索引嗎?怎么能有相同的值?"

所以說"主鍵是唯一性索引"是有歧義的;主鍵是唯一性索引的前提是"當表中只有一個主鍵時,它才是唯一的索引;當表中有多個主鍵時,稱為復(fù)合主鍵,復(fù)合主鍵聯(lián)合保證唯一性索引,即可理解為復(fù)合主鍵聯(lián)合起來成為了一個表的唯一性索引(主鍵)"。為什么自增長ID已經(jīng)可以作為唯一標識的主鍵,為啥還需要復(fù)合主鍵呢?因為,并不是所有的表都要有id這個字段啊,比如,我們建一個學(xué)生表,沒有唯一能標識學(xué)生的ID,怎么辦呢?學(xué)生的名字、年齡、班級都可能重復(fù),無法使用單個字段來唯一標識,這時,我們可以將多個字段設(shè)置為主鍵,形成復(fù)合主鍵,這多個字段聯(lián)合標識唯一性,其中,某幾個主鍵字段值出現(xiàn)重復(fù)是沒有問題的,只要不是有多條記錄的所有主鍵值完全一樣,就不算重復(fù)。

總結(jié): 在開發(fā)中,主鍵字段數(shù)最好保持一個,非要創(chuàng)建兩個復(fù)合主鍵,那么在創(chuàng)建表的時候就應(yīng)該要尋找一個能唯一性標識該對象的一個字段來識別。簡而言之就是少用復(fù)合主鍵。

如何添加復(fù)合主鍵?

可以在創(chuàng)建表時添加復(fù)合主鍵,此時主鍵由多個字段聯(lián)合組成,語法規(guī)則如下:

PRIMARY KEY [字段1,字段2,…,字段n]

示例:創(chuàng)建數(shù)據(jù)表 tb_emp,假設(shè)表中沒有主鍵 id,為了唯一確定一個員工,可以把 name、deptId 聯(lián)合起來作為主鍵

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)

mysql復(fù)合主鍵指的是什么意思

聯(lián)合主鍵

聯(lián)合主鍵和復(fù)合主鍵的區(qū)別在于:聯(lián)合主鍵體現(xiàn)在多個表上,復(fù)合主鍵體現(xiàn)在一個表中的多個字段。

學(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)
);

此時stu_course中id就表示聯(lián)合主鍵,通過id可以獲取學(xué)生和課程的一條記錄

所以聯(lián)合主鍵,顧名思義就是多個主鍵聯(lián)合形成一個主鍵組合,體現(xiàn)在聯(lián)合。 (主鍵原則上是唯一的,別被唯一值所困擾) 索引可以極大的提高數(shù)據(jù)的查詢速度,但是會降低插入、刪除、更新表的速度,因為在執(zhí)行這些寫操作時,還要操作索引文件。 簡單的例子 主鍵A跟主鍵B組成聯(lián)合主鍵C,主鍵A跟主鍵B的數(shù)據(jù)可以完全相同,聯(lián)合就在于主鍵A跟主鍵B形成的聯(lián)合主鍵C是唯一的。

“mysql復(fù)合主鍵指的是什么意思”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI