今天電面被問到了一個復合主鍵的問題,擊中了自己的知識盲區,當時回答是用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掉原有的主鍵,再添加復合主鍵進去。