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

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

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

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

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

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

1)cascade方式
在父表上update/delete记录时,同步update/delete掉子表的匹配记录 

2)set null方式
在父表上update/delete记录时,将子表上匹配记录的列设为null
要注意子表的外键列不能为not null  

3)No action方式
如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作  

4)Restrict方式
同no action, 都是立即检查外键约束

5)Set default方式
父表有变更时,子表将外键列设置成一个默认的值 但Innodb不能识别

多对一:

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

部门表:
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
);

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值