三种表关系及关系表的创建

所有数据在一张表中导致: 组织结构不清晰,扩展性差,浪费空间

foreign key 外键是一种约束,约束两张表的关系

约束1:创建表 先建立被关联表,才能建关联表
约束2:查数据 被关联表先插入数据,关联表才能插入数据
约束3:删数据 先删除关联表中的数据,才能删被关联表的数据
约束4:不能改关联字段 

级联: 同步更新,同步删除

on update cascade # 同步更新
on delete cascade # 同步删除
注: 级联是绑定给外键的

多对一:

外键健在'多'的那张表中

部门表:
create table dep(
    id int primary key auto_increment,
    dep_name char(16),
    dep_comment char(64)
);

员工表
create table emp(
    id int primary key auto_increment,
    name char(16),
    gender enum('male','female') not null default 'male',
    dep_id int,
    foreign key(dep_id) references dep(id) 
    on update cascade # 同步更新 
    on delete cascade # 同步删除
);

多对多:

外键健在第三张表中
create table author(
    id int primary key auto_increment,
    name varchar(20)
);
create table book(
    id int primary key auto_increment,
    name char(16),
    price int
);
​# 创建第三张表
create table author2book(
    id int not null unique auto_increment,
    author_id int not null,
    book_id int not null,
    fk_author foreign key(author_id) references author(id) on delete cascade on update cascade,
    fk_book foreign key(book_id) references book(id) on delete cascade on update cascade,
    primary key(author_id,book_id)
);

一对一

# 创建一对一关联表 外键放在被频繁查询的表中并且外键为单列唯一
create table customer(
    id int primary key auto_increment,
    name varchar(64) not null,
    qq int not null,
    phone int not null
);
create into student(
    id int primary key auto_increment,
    name varchar(64) not null,
    customer_id int unique,  # 在一对一关联表中 此字段为唯一的
    foreign key(customer_id) references customer(id)
    on update cascade
    on delete cascade
);

 

你可能感兴趣的:(MySQL)