MySQL外鍵+惟一索引

MySQL外鍵+惟一索引

2019-08-22數據結構

1.外鍵

是指一個表裏的列與另外一張表裏的列進行關係鏈接,可用於使用簡單的數字或字母替代複雜的數據結構,不只能夠節省空間,也擁有約束功能,可減小書寫出錯的機會。ide

1.1使用方式

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

其中變量名是本身給定的,約定不能夠有重複;spa

列名即須要鏈接外鍵的列;code

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

列名2是和表中鏈接對應的列;索引

1.2實例

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

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對應起來。innodb

 2.惟一索引

惟一索引使用關鍵字:unique;具備如下特色table

  • 不可重複
  • 加速查找
  • 能夠爲空
  • 能夠由多列聯合生成

惟一索引與主鍵的區別是:1)惟一索引中能夠有數據爲空,2)惟一索引在一個表中能夠不止一個。class

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;
相關文章
相關標籤/搜索