MySQL外鍵+唯一索引


MySQL外鍵+唯一索引

2019-08-22

1.外鍵

是指一個表里的列與另一張表里的列進行關系連接,可用於使用簡單的數字或字母替代復雜的數據結構,不僅可以節省空間,也擁有約束功能,可減少書寫出錯的機會。

1.1使用方式

constraint 變量名 foreign key (列名) references 表名2(列名2);

其中變量名是自己給定的,約定不可以有重復;

列名即需要連接外鍵的列;

表名2值指的是外鍵的表;

列名2是和表中連接對應的列;

1.2實例

例如下面兩個表,表1是機器狀態表,表2是機器信息表;將機器的四個狀態通過1,2,3,4這4個值表示出來:

create table machinestatus(
    status_id int auto_increment primary key,
    status_name char(20)
    )engine=innodb default charset=utf8;
insert into machinestatus(status_name) values("待機"),("運行"),("故障"),("關機");

create table machineinfo(
    id int auto_increment primary key,
    identifier int not null,
    status int,
    constraint fk_info_status foreign key (status) references machinestatus(status_id)
    )engine=innodb default charset=utf8;

即將machineinfo表中的status與machinestatus中的id對應起來。

 2.唯一索引

唯一索引使用關鍵字:unique;具有以下特點

  • 不可重復
  • 加速查找
  • 可以為空
  • 可以由多列聯合生成

唯一索引與主鍵的區別是:1)唯一索引中可以有數據為空,2)唯一索引在一個表中可以不止一個。

2.1使用方式:

unique 變量名 (列1,列2···)

如果是單列的唯一索引,括號內填寫一個列名即可。

2.2實例

單列唯一索引

create table userinfo(
    id int auto_increment primary key,
    age int,
    name char(10),
    card int not null,
    email char(20),
    unique ucard (card)
    )engine=innodb default charset=utf8;

聯合唯一索引

create table userinfo(
    id int auto_increment primary key,
    age int,
    name char(10),
    card int not null,
    phone_num char(20),
    email char(20),
    unique ucard (card,phone_num)
    )engine=innodb default charset=utf8;

3.外鍵+唯一索引

3.1 外鍵實現一對多引用

外鍵表中被連接的數據可以多次重復出現在使用其的表中;例如

--部門表
create table department(
    id int not null auto_increment primary key,
    depart char(64)
    )engine=innodb default charset=utf8;

--員工信息表
create table userinfo3(
    id int not null auto_increment primary key,
    name char(20) not null,
    age int,
    depart_id int not null,
    constraint fk_u2d_depart foreign key (depart_id) references department(id)
    )engine=innodb default charset=utf8;

部門表中的部門id中的個值可以多次重復的被員工信息表引用。

3.2 外鍵約束+唯一索引約束實現一對一引用

--用戶表
create table userinfo(
    id int not null auto_increment primary key,
    name char(20) not null,
    )engine=innodb default charset=utf8;

--旅行登記表
create table travelregister(
    id int not null auto_increment primary key,
    job_num int,
    constraint fk_t2u_depart foreign key (job_num) references userinfo(id),
    unique uj (job_num)
    )engine=innodb default charset=utf8;

旅行登記表中登記的是參加旅行的員工,每個員工最多登記一次,通過外鍵引用員工表的id來表示員工本人,而通過unique來限制員工重復出現;使員工表id個值最多被引用一次。

3.3 外鍵約束實現多對多引用

可以重復記錄

--員工表
create table userinfo2(
    id int auto_increment primary key,
    name char(10) not null,
    gender char(10),
    )engine=innodb default charset=utf8;

--主機表
create table host(
    id int auto_increment primary key,
    hostname char(64) not null
    )engine=innodb default charset=utf8;

--員工主機關系表
create table user2host(
    id int auto_increment primary key,
    user_id int not null,
    host_id int not null,
    constraint fk_u2h_user foreign key (user_id) references userinfo2(id),
    constraint fk_u2h_host foreign key (host_id) references host(id)
    )engine=innodb default charset=utf8;

3.4外鍵約束+唯一索引約束實現多對多引用

可以防止重復記錄

--員工表
create table userinfo2(
    id int auto_increment primary key,
    name char(10) not null,
    gender char(10),
    )engine=innodb default charset=utf8;

--主機表
create table host(
    id int auto_increment primary key,
    hostname char(64) not null
    )engine=innodb default charset=utf8;

--員工主機關系表
create table user2host(
    id int auto_increment primary key,
    user_id int not null,
    host_id int not null,
    constraint fk_u2h_user foreign key (user_id) references userinfo2(id),
    constraint fk_u2h_host foreign key (host_id) references host(id),
    unique uq_user_host (user_id,host_id)
    )engine=innodb default charset=utf8;

 


免責聲明!

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



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