外键使用场景: 下拉选框展示数据优先使用外健
外键名是不能重复的
外键名的命名规范: fk_表名 或 fk_表名_字段名
1. 外键的基本使用
- 例如: 表A中nid字段里面的值,必须是表B中id字段里的任意一个值
- 一张表可以建立多个外键
# 表B
create table tableB(
bid int auto_increment primary key,
title char(15)
)engine=innodb default charset=utf8;
# 表C
create table tableC(
cid int auto_increment primary key,
title char(15)
)engine=innodb default charset=utf8;
# constraint 外键名 foreign key (主表字段) references 从表名(从表字段)
# 表A
create table tableA(
aid int auto_increment primary key,
name varchar(32),
sid int,
did int,
constraint fk_user_sid foreign key (sid) references tableB(bid),
constraint fk_user_did foreign key (did) references tableC(cid)
)engine=innodb default charset=utf8;
- 同时绑定两列为外键的前提是这两列必须构成为一个主键 -> 如果同时绑定了两列为外键,那么这两列的数据只能是对应的另外两列里的数据
create table t1(
id int auto_increment,
pid int not null,
primary key(id,pid)
)engine=innodb default charset=utf8;
# 同时绑定两列为外键的表
create table t2(
id int auto_increment primary key,
id1 int,
id2 int,
constraint fk_user_sid foreign key (id1,id2) references t1(id,pid)
)engine=innodb default charset=utf8;
2. 外键的变种
- 一对多
- 就是平时使用外键不加唯一索引的情况
- 一对一

# 用户表
create table userinfo(
id int auto_increment primary key,
name char(10),
gender char(10),
email varchar(64)
)engine=innodb default charset=utf8;
# 管理员表
create table admin(
id int not null auto_increment primary key,
username varchar(64) not null,
password varchar(64) not null,
user_id int not null,
unique uq_u1 (user_id),
constraint fk_admin_u1 foreign key (user_id) references userinfo(id)
)engine=innodb default charset=utf8;
- 多对多1

# 用户表
create table userinfo(
id int auto_increment primary key,
name varchar(10),
sex varchar(10)
)engine=innodb default charset=utf8;
# 相亲约会记录表
create table appointment(
id int auto_increment primary key,
mid int,
wid int,
constraint fk_m_user foreign key (mid) references userinfo(id),
constraint fk_w_user foreign key (wid) references userinfo(id)
)engine=innodb default charset=utf8;
- 多对多2

# 用户表
create table userinfo(
id int auto_increment primary key,
name char(10),
gender char(10),
email varchar(64)
)engine=innodb default charset=utf8;
# 主机表
create table host(
id int auto_increment primary key,
hostname char(64)
)engine=innodb default charset=utf8;
# 用户主机关系表
create table userhost(
id int auto_increment primary key,
userid int not null,
hostid int not null,
unique uq_user_host (userid,hostid),
constraint fk_u2h_user foreign key (userid) references userinfo(id),
constraint fk_u2h_host foreign key (hostid) references host(id)
)engine=innodb default charset=utf8;