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;
相关文章
相关标签/搜索