一、外键
- 现在我们有两种张表“分类表”和“商品表”,为了表明商品属于哪个分类,通常情况下,我们将商品表上添加一列,用于存放分类cid的信息,此列称为:外键。
- 此时,
“分类表category”称为:主表,cid称为主键。
”商品表products“称为:从表,category_id称为外键。
我们通过主表的主键和从表的外键来描述主外键关系,呈现的就是一对多关系。 - 外键特点:
从表外键的值是对主表主键的引用。
从表外键类型,必须与主表主键类型一致 - 声明外键约束
语法:alter table 从表 add [constraint] [外键名称] foreign key(从表外键字段名) references 主表(主表的主键);
其中 [外键约束] 用于删除外键约束的,一般建议“_fk"结尾
alter table 从表 drop foregin key 外键名称;
- 使用外键目的:
保证数据完整性
二、表与表之间的关系
表与表之间的关系,说的就是表与表数据之间的关系。
- 一对一关系:(了解)
- 在实际开发中应用不多,因为一对一可以创建成一张表。
- 一对多关系:
- 常见实例:客户和订单,分类和商品,部门和员工。
- 一对多建表原则:在从表(多方)创建一个字段,字段作为外键指向主表(一方)的主键。
- 多对多关系:
-
常见实例:学生和课程,商品和订单,人和角色。
-
多对多关系建表原则:需要创建第三张表,中间表至少两个字段,这两个字段分别作为外键指向各自一方的主键。(就是将一个多对多拆分成两个一对多)
-
两张表都是主表,第三张表为从表,提供两个字段,都是外键。
三、创建表实现
1、一对多:分类和商品
#创建数据库
create database web01;
#使用数据库
create web01;
#创建分类表
create table category(
cid int primary key auto_increment, #主表的主键
cname varchar(20) #分类名称
);
#商品表
create table products(
pid int primary key auto_increment,
name varchar(20),
price double
);
#添加外键字段category_id
alter table products add category_id int;
#添加外键约束
alter table products add foreign key(category_id) references category(cid);
2、多对多:订单和商品
#订单表
create table orders(
oid int primary key auto_increment,
totalprice double #总计
);
#订单项表
create table orderitem(
oid int primary key, #订单id
pid int primary key #商品id
);
#订单表和订单项表的主外键关系
alter table orderitem add foreign key(oid) references orders(oid);
#商品表和订单项表的主外键关系
alter table orderitem add foreign key(pid) references products(pid);
总结:
- 添加数据:主表:随意添加;从表:受主表限制,不能添加主表中不存在的数据。
- 删除数据:主表:如果某一行的数据受到从表的依赖,在从表中已经使用,则不能删除,;从表:随意删除。
- 要想删除主表中与从表有关联关系的数据,可以这么做:
1.解除主从表的约束关系
2.先删除从表中与主表有关系的数据,再删除主表中的数据。