一对多关系
比如员工和部门之间 就是一对多的关系
即从员工的方面看,一个员工只有一个部门对应
从部门的方面看,一个部门可以有多个员工
下面是员工部门表
如果以上面这种方式存储数据,当数据量多的时候有大量的冗余,而且不利于数据管理。
我们可以考虑用两个表存储数据并建立联系
比如:我们可以建一个员工表,建一个部门表,但是要怎样让两个表建立关系呢,这就引出外键的功能。
我们可以在员工表的基础上添加一列用来标识部门的数据
为什么在员工表添加 不在部门表添加 因为一个员工对应一个部门,如果在部门表添加,那得添加一个格子要添加多个员工,这是不行的
注意 要先创建部门表,因为员工表的dep_id依赖于部门表的id
创建部门表:
create table dep(id int primary key auto_increment,name varchar(16));
创建员工表
create table emp(id int primary key auto_increment,
name varchar(16),
gender enum('male','female') default 'male',
dep_id int,
foreign key(dep_id) references dep(id) on update cascade on delete cascade);
注意on update cascade on delete cascade
是保证部门表数据删除或更新时,员工表跟着一起更新。
多对多关系
比如作者和图书之间就是多对多关系
从作者方面看,一个作者可以写多本书;
从书的方面看,一本书可以由多个作者写。
注意在多对多关系中,不能像一对多关系那样在两个表中的一个表上建立两者的关系,应该要用一个独立的表建立关系。因为A表要和B表的某列建立联系,必须先把B表创建出来,再把B表要建立关系的某列绑定给A表,如果是多对多关系,无法满足条件。
创建book表:
create table book(id int primary key auto_increment,name varchar(32),price int);
创建author表:
create table author(id int primary key auto_increment,name varchar(32),age int);
创建联系:
create table book2author(
id int primary key auto_increment,
book_id int,
author_id int,
foreign key(book_id) references book(id) on update cascade on delete cascade,
foreign key(author_id) references author(id) on update cascade on delete cascade);
一对一关系
比如查询信息时先展示基本信息,再展示详细信息
作者详情表:
create table authordetail(
id int primary key auto_increment,
phone varchar(16),addr varchar(32)
);
作者基本信息表:
create table author2(id int primary key auto_increment,
name varchar(16),
age int,
authordetail_id int unique,
foreign key(authordetail_id) references authordetail(id) on update cascade on delete cascade);
注意外键字段一定要unique
标识唯一