文档章节

数据库篇多表操作

stars永恒
 stars永恒
发布于 01/20 00:39
字数 1299
阅读 15
收藏 0

第1章 多表操作

实际开发中,一个项目通常需要很多张表才能完成。例如:一个商城项目就需要分类表(category)、商品表(products)、订单表(orders)等多张表。且这些表的数据之间存在一定的关系,接下来我们将在单表的基础上,一起学习多表方面的知识。

 

1.1 表与表之间的关系
有3类表关系:一对多(多对一)、多对多、一对一(了解)
 一对多关系:
 常见实例:学生和考试成绩(画图),客户和订单,分类和商品,部门和员工.
 一对多建表原则:在从表(多方)创建一个字段,字段作为外键指向主表(一方)的主键.


 多对多关系:
 常见实例:学生和教师,商品和订单(画图),学生和课程、用户和角色
 多对多关系建表原则:需要创建第三张表,中间表中至少两个字段,这两个字段分别作为外键指向各自一方的主键.


 一对一关系:(了解)
 在实际的开发中应用不多,比如QQ号码,和QQ用户信息
 因为一对一可以创建成一张表.
 两种建表原则:
 外键唯一:主表的主键和从表的外键(唯一),形成主外键关系,外键唯一unique。
 外键是主键:主表的主键和从表的主键,形成主外键关系。

 

1.2 外键约束

现在我们有两张表“分类表”和“商品表”,为了表明商品属于哪个分类,通常情况下,我们将在商品表上添加一列,用于存放分类cid的信息,此列称为:外键

此时“分类表category”称为:主表,“cid”我们称为主键。“商品表products”称为:从表,category_id称为外键。我们通过主表的主键和从表的外键来描述主外键关系,呈现就是一对多关系。
外键特点:

 从表外键的值是对主表主键的引用。
 从表外键类型,必须与主表主键类型一致。

 声明外键约束
语法:alter table 从表 add [constraint] [外键名称] foreign key (从表外键字段名) references 主表 (主表的主键);
[外键名称] 用于删除外键约束的,一般建议“_fk”结尾
alter table 从表 drop foreign key 外键名称
 使用外键目的:
 保证数据完整性

1.3 一对多操作
1.3.1 分析

 category分类表,为一方,也就是主表,必须提供主键cid
 products商品表,为多方,也就是从表,必须提供外键category_id

1.3.2 实现:分类和商品

创建分类表

create table category(
cid int(32) PRIMARY KEY ,
cname varchar(100) #分类名称
);

商品表

CREATE TABLE products (
pid int PRIMARY KEY ,
pname VARCHAR(40) ,
price DOUBLE ,
category_id int
);

添加约束

alter table products add constraint product_fk foreign key (category_id) references category (cid);

1.3.3 操作

1 向分类表中添加数据

INSERT INTO category (cid ,cname) VALUES(1,'服装');

2 向商品表添加普通数据,没有外键数据,默认为null

INSERT INTO products (pid,pname) VALUES(1,'商品名称');

3 向商品表添加普通数据,含有外键信息(数据存放在)

INSERT INTO products (pid ,pname ,category_id) VALUES(2,'商品名称2', 1);

4 向商品表添加普通数据,含有外键信息(数据不存在) -- 不能异常

INSERT INTO products (pid ,pname ,category_id) VALUES(3,'商品名称2',9);

5 删除指定分类(分类被商品使用) -- 执行异常

DELETE FROM category WHERE cid = 1;

1.4 多对多
1.4.1 分析


 商品和订单多对多关系,将拆分成两个一对多。
 products商品表,为其中一个一对多的主表,需要提供主键pid
 orders 订单表,为另一个一对多的主表,需要提供主键oid
 orderitem中间表,为另外添加的第三张表,需要提供两个外键oid和pid

 

1.4.2 实现:订单和商品

商品表[已存在]

订单表

create table orders(
oid int PRIMARY KEY ,
totalprice double #总计
);

订单项表

create table orderitem(
oid int,-- 订单id
pid int(50)-- 商品id
);

---- 订单表和订单项表的主外键关系

alter table orderitem add constraint orderitem_orders_fk foreign key (oid) references orders(oid);

---- 商品表和订单项表的主外键关系

alter table orderitem add constraint orderitem_product_fk foreign key (pid) references products(pid);

1.4.3 操作

1 向商品表中添加数据

INSERT INTO products (pid,pname) VALUES(3,'商品名称');

2 向订单表中添加数据

INSERT INTO orders (oid ,totalprice) VALUES(1,998);
INSERT INTO orders (oid ,totalprice) VALUES(2,100);

3向中间表添加数据(数据存在)

INSERT INTO orderitem(pid,oid) VALUES(1, 1);
INSERT INTO orderitem(pid,oid) VALUES(1, 2);
INSERT INTO orderitem(pid,oid) VALUES(2,2);

4删除中间表的数据

DELETE FROM orderitem WHERE pid=2 AND oid = 2;

5向中间表添加数据(数据不存在) -- 执行异常

INSERT INTO orderitem(pid,oid) VALUES(2, 3);

6删除商品表的数据 -- 执行异常

DELETE FROM products WHERE pid = 1;

© 著作权归作者所有

共有 人打赏支持
上一篇: SQL语句查询
下一篇: 数据库篇一
stars永恒
粉丝 10
博文 168
码字总数 221677
作品 0
大兴
后端工程师
私信 提问
MongoDb的基本操作快速入门

1.MongoDb简介 mongodb是一个基于分布式存储的开源数据库系统又被称为文档数据库,可以将数据存储为一个文档,数据结构有键值对(key=>value)对组成,存储的文档类似于JSON对象(BSON->JSO...

OMCloud
2018/06/26
0
0
将不确定变为确定~transactionscope何时提升为分布式事务~再续(避免引起不必要的MSDTC)

相关文章 将不确定变为确定~transactionscope何时提升为分布式事务 将不确定变为确定~transactionscope何时提升为分布式事务~续 将不确定变为确定~transactionscope何时提升为分布式事务~再续...

mcy247
2017/12/05
0
0
Spring Boot之数据库访问

前几篇介绍了RESTful API的实现、模板引擎的使用,但是这些内容不足以构建一个动态的WEB应用,作为一个后台服务,还需要各种类型的数据库,来持久化我们的数据,为调用方提供数据来源,本篇则...

老虎是个蛋蛋
2016/12/24
304
0
聊聊:数据库中为什么不推荐使用外键约束

参考文献:database.51cto.com/art/201811/587914.htm 想起大学刚毕业的时候,在一家做保险系统二次开发的公司做软件工程师,那时候我接触到了他们系统的数据库,查看了下他们系统使用到的表...

微总结
2018/11/30
0
0
轻量级ORM框架——第一篇:Dapper快速学习

     我们都知道ORM全称叫做Object Relationship Mapper,也就是可以用object来map我们的db,而且市面上的orm框架有很多,其中有一个框架 叫做dapper,而且被称为the king of ORM。 一:...

Linybo2008
2018/12/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

学习设计模式之路

https://java-design-patterns.com/patterns/ https://www.oodesign.com/ https://www.programering.com/a/MTNxAzMwATY.html https://design-patterns.readthedocs.io/zh_CN/latest/ https:/......

晨猫
今天
1
0
JDK1.8 jar包说明

JDK 1.8 lib:access-bridge-64.jarcharsets.jarcldrdata.jardeploy.jardnsns.jarjaccess.jarjavawa.jarjce.jarjfr.jarjfxrt.jarjfxswt.jarjsse.jarlocaledata.jar......

冷基
今天
1
0
判断用户的icloud是否开启【Swift4.2】

使用icloudkit存储用户私人数据时,必须判断用户的icloud是否开启【Swift4.2】 func isICloudContainerAvailable()-> Bool { if FileManager.default.ubiquityIdentityToken != ni......

叶落花开
今天
2
0
今天的学习

1、执行git add *命令就把改动提交到了暂存区,执行git pull命令将远程仓库的数据拉到当前分支并合并,执行git checkout [branch-name]切换分支 2、执行git commit -m '说明' 命令就把改动提...

墨冥
昨天
0
0
Android4.4 及以下TextView,Button等控件使用矢量图报错

1 问题描述 最近项目开发中,图标资源我尽量使用了矢量图,然而配置了基本的兼容设置,程序在低版本中运行还是出现了问题。 xml布局文件中,在TextView中使用矢量图,比如android:drawableS...

newtrek
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部