復合主鍵和聯合主鍵


  今天電面被問到了一個復合主鍵的問題,擊中了自己的知識盲區,當時回答是用ALTER TABLE ADD PRIMARY KEY添加,后來查了下答的不對,正好借着機會把聯合主鍵也復習了下。


  首先說一下聯合主鍵,聯合主鍵其實就是中間表。在多對多模型里,需要兩個表中的主鍵組成聯合主鍵,這樣就可以查到兩個表中的每個數據,如下例所述:

CREATE TABLE TEAM( 
Id MEDIUMINT AUTO_INCREMENT COMMENT '主鍵',
Dev VARCHAR (30) COMMENT '碼農', 
Pm VARCHAR(30) COMMENT '項目經理', 
Hr VARCHAR(30) COMMENT '人力' , 
PRIMARY KEY (Id) 
)
ENGINE = INNODB, 
CHARSET = UTF8 ;
CREATE TABLE information (
Id MEDIUMINT AUTO_INCREMENT COMMENT '主鍵',
Name VARCHAR(30) COMMENT '姓名',
Age int(10) COMMENT '年齡',
PRIMARY KEY(Id)
)
ENGINE=INNODB,
CHARSET = UTF8;

為了查詢兩個表之間的元素,我們創建一個中間表 TEAM_info

CREATE TABLE IF NOT EXISTS TEAM_info(
Id MEDIUMINT AUTO_INCREMENT COMMENT '主鍵Id',
TEAM_Id MEDIUMINT COMMENT '團隊Id',
info_Id MEDIUMINT COMMENT '信息Id',
PRIMARY KEY(Id) 
)
ENGINE=INNODB,
CHARSET=UTF8;

然后就可以通過中間表進行連表查詢操作。


  接下來是復合主鍵,一張表只能有一個主鍵,但根據需要,我們可以設置多個字段同時為主鍵,這就叫做復合主鍵。(PS:我看好多人翻譯成聯合主鍵,我個人感覺不太准確,容易混淆)比如我們創建一張表

CREATE TABLE IF NOT EXIST student(
Name VARCHAR (30 ) COMMENT '姓名',
Age INT(30)  COMMENT '年齡',
PRIMARY KEY(Name,Age) 
);

這里的Name和Age字段就是復合主鍵,主要是為了防止Name重復,因此設置Age和Name為復合主鍵,主鍵的字段長度和字段數目要越少越好。然后這里有個注意點,如果要在INNODB引擎下設置主鍵自增長,自增長的列必須是第一列,然后只需要指定非自增長的列就可以了,否則會出現自增長重復。一旦出現自增長重復的話,我們可以創建一個主鍵索引,或者唯一索引。如果表結構已存在,想要添加復合主鍵,則應該使用如下方式。

ALTER TABLE tb_name 
ADD PRIMARY KEY (
PRIMARY_KEY_NAME_1,
PRIMARY_KEY_NAME_2
);

 

需要注意的是,這里需要原來的表結構里沒有主鍵,如果有的話,需要先ALTER DROP掉原有的主鍵,再添加復合主鍵進去。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM