外键使用场景: 下拉选框展示数据优先使用外健
外键名是不能重复的
外键名的命名规范: 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;