外键约束 以及 数据库中实体的对应关系(1==1,1==n,n==n)

1.1.1 外键约束

Create database day16;

Use day16;

创建部门表:

create table dept(

did int primary key auto_increment,

dname varchar(20)

);

insert into dept values (null,’研发部’);

insert into dept values (null,’教研部’);

insert into dept values (null,’市场部’);

创建员工表:

create table emp(

eid int primary key auto_increment,

ename varchar(20),

email varchar(20),

eprice double

);

insert into emp values (null,’张三’,’zs.itcast.cn’,4500);

insert into emp values (null,’李四’,’ls.itcast.cn’,5500);

insert into emp values (null,’王五’,’ww.itcast.cn’,6500);

insert into emp values (null,’赵六’,’zl.itcast.cn’,7500);

现在描述部门和员工之间关系:

  • 需要在员工表中添加一个字段.字段就是部门编号!!!

alter table emp add dno int;

  • 修改员工添加所对应部门:

update emp set dno = 1 where eid = 1;

update emp set dno = 2 where eid = 2;

update emp set dno = 3 where eid = 3;

update emp set dno = 3 where eid = 4;

  • 现在市场部不景气,删除市场部,删除了市场部,那么市场部下属员工要如何处理?

  • 如果现在删除部门,那么员工还存在而且还指向的部门是刚删除的那个!!!

  • 必须使用外键约束:

  • 单表约束的作用:用来保证数据的完整性.

  • 外键约束:保证多个表之间的数据完整性.

  • foreign key:外键约束

  • alter table emp add foreign key (dno) references dept(did);

1.1.2 多表设计中的三种实体关系:

一对多:

一个部门可以对应多个员工,一个员工只能属于一个部门!

一个客户可以对应多个订单,一个订单只能属于一个客户!

  • 一对多关系建表原则:

  • 需要在多的一方添加一个字段,作为外键指向一的一方主键!

图一 一对多的建表原则
这里写图片描述

多对多:

一个学生可以选择多门课程,一个课程可以被多个学生所选择的!

  • 多对多关系建表原则:

  • 需要创建第三张表,第三张表中需要两个字段,这两个字段分别作为外键指向多对多双方的主键!

图二 多对多的建表原则
这里写图片描述

一对一:(使用比较少)

一个公司只能对应一个地址,一个地址也只能对应一个公司!

一对一的关系式比较少用!

  • 公司表:地址是公司的表的字段.

  • 一对一的关系的建表原则:

  • 主键对应:

  • 唯一外键对应:

图三 一对一的建表原则
这里写图片描述

一对多关系
一对多关系是最普通的一种关系。在这种关系中,A 表中的一行可以匹配 B 表中的多行,但是 B 表中的一行只能匹配 A 表中的一行。例如,publishers 和 titles 表之间具有一对多关系:每个出版社出版很多书,但是每本书名只能出自一个出版社。
只有当一个相关列是一个主键或具有唯一约束时,才能创建一对多关系。
多对多关系
在多对多关系中,A 表中的一行可以匹配 B 表中的多行,反之亦然。要创建这种关系,需要定义第三个表,称为结合表,它的主键由 A 表和 B 表的外部键组成。例如,authors 和 titles 表具有多对多关系,这是由于这些表都与titleauthors 表具有一对多关系。titleauthors 表的主键是 au_id 列(authors 表的主键)和 title_id 列(titles 表的主键)的组合。
一对一关系
在一对一关系中,A 表中的一行最多只能匹配于 B 表中的一行,反之亦然。如果相关列都是主键或都具有唯一约束,则可以创建一对一关系。
这种关系并不常见,因为一般来说,按照这种方式相关的信息都在一个表中。可以利用一对一关系来:
分割具有多列的表。
由于安全原因而隔离表的一部分。
保存临时的数据,并且可以毫不费力地通过删除该表而删除这些数据。
保存只适用于主表的子集的信息。

数据库表设计(一对多,多对多)
做一个项目,必然是少不了数据库设计的!在学习阶段,基本都是单表。然而在实际开发过程中,一对多,多对多的表处处都是!简单整理一下,一对多,多对多表如何设计整理一下思路:
数据库实体间有三种对应关系:一对一,一对多,多对多。
一对一关系示例:
一个学生对应一个学生档案材料,或者每个人都有唯一的身份证编号。
一对多关系示例:
一个学生只属于一个班,但是一个班级有多名学生。
多对多关系示例:
一个学生可以选择多门课,一门课也有多名学生。

1.一对多关系处理:
通过学生和班级问题了解一对多:
设计数据库表:只需在 学生表 中多添加一个班级号的ID;
注:在数据库中表中初学时,还是通过添加主外键约束,避免删除数据时造成数据混乱!

2.多对多关系处理:
通过学生选课了解多对多问题的处理:
在多对多中在一个表中添加一个字段就行不通了,所以处理多对多表问题时,就要考虑建立关系表了
例:
学生表: 课程表: 关系表:
注:所以对于多对多表,通过关系表就建立起了两张表的联系!多对多表时建立主外键后,要先删除约束表内容再删除主表内容

在数据库中,如果两个表的之间的关系为,多对多的关系,如:“学生表和课程表”,一个学生的可以选多门课,一门课也可以被多门学习选;根据数据库的设计原则,应当形成第三张关联表

步骤1:创建三张数据表Student ,Course,Stu_Cour
/*学生表/
CREATE TABLE student (
stu_id INT AUTO_INCREMENT,
NAME VARCHAR(30),
age INT ,
class VARCHAR(50),
address VARCHAR(100),
PRIMARY KEY(stu_id)
)
/学生课程表/
CREATE TABLE Course(
cour_id INT AUTO_INCREMENT,
NAME VARCHAR(50),
CODE VARCHAR(30),
PRIMARY KEY(cour_id)
)
/*学生课程关联表/
CREATE TABLE Stu_Cour(
sc_id INT AUTO_INCREMENT,
stu_id INT ,
cour_id INT,
PRIMARY KEY(sc_id)
)
第二步:为Stu_Cour表添加外键
1
2
3
/添加外键约束/
ALTER TABLE Stu_Cour ADD CONSTRAINT stu_FK1 FOREIGN KEY(stu_id) REFERENCES student(stu_id)
ALTER TABLE Stu_Cour ADD CONSTRAINT cour_FK2 FOREIGN KEY(cour_id) REFERENCES Course(cour_id)

ps:
user用户表
id,name
goods商品表
id,name,total,gailv,shengyu
user_goods用户商品关联表
user_id,goods_id,goods_num

用户表
用户ID(主键), 用户名称……

图片表
图片ID(主键), 图片名称, 图片保存位置….

用户– 图片关系表
用户ID, 图片ID (用户ID和图片ID建联合主键), 序号(图片在该用户的显示顺序)….

取图片如:
隔行取图片(取偶数行):
SELECT A.图片ID, B.图片名称, …… FROM 用户– 图片关系表 A
INNER JOIN
图片表 B
ON A.图片ID = B.图片ID
WHERE A.用户ID = ‘用户编号’ and (A.序号)%2 = 0

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值