多表操作(外键)

news2024/10/6 1:40:19

多表操作

外键

外键(foreign key): 外键为某个表中的一列,它包含另一个表的主键值,定义了两个表之间的关系。

主表(父表):对于两个具有关联关系的表而言,相关联字段中的主键所在的那个表即是主表。

从表(子表):对于两个具有关联关系的表而言,相关联字段中的外键所在的那个表即是从表。

外键特点

  • 从表外键的值是对主表主键的引用。

  • 从表外键类型,必须与主表主键类型一致。

外键的作用: 保证数据引用的完整性、一致性。

  • 要考虑向从表添加数据时,外键字段必须是主表主键的引用,否则添加失败。

  • 要考虑从主表中删除数据时,主键并未被从表引用,否则删除失败。

语法

-- 添加外键
alter table 从表 add [constraint][外键名称] foreign key (从表外键字段名) 
references 主表 (主表的主键);
-- [外键名称]用于删除外键约束的,一般建议“_fk”结尾
-- 也可以在建表时添加外键约束,
--CONSTRAINT orders_customers_fk FOREIGN KEY (cust_id) REFERENCES customers (cust_id)

-- 删除外键
alter table 从表 drop foreign key 外键名称

案例

  现在我们有两张表“顾客表”和“订单表”,为了表明订单属于哪个顾客,通常情况下,我们将在订单表上添加一列,用于存放cust_id的信息,此列称为:外键。

在这里插入图片描述

# 添加外键
ALTER TABLE orders ADD CONSTRAINT orders_customers_fk FOREIGN KEY (cust_id) REFERENCES customers (cust_id);
# 删除外键
ALTER TABLE orders DROP FOREIGN KEY orders_customers_fk;

# 向主表添加数据
INSERT INTO customers (cust_id,cust_name) VALUES (666,'王老五');-- 成功
# 向从表添加数据
INSERT INTO orders(order_date, cust_id) VALUES (now(),666);-- 成功
# 向从表添加数据
INSERT INTO orders (order_date,cust_id) VALUES (now(),111);-- 失败
# 主表删除数据
DELETE FROM customers WHERE cust_id=666;-- 失败

  
  

表关系

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

一对一关系

  • 在实际的开发中不多.因为一对一可以创建成一张表.

  • 常见实例:商品表和商品描述表

两种建表原则:

  • 外键唯一:主表的主键和从表的外键(唯一),形成主外键关系,外键唯一unique。

  • 外键是主键:主表的主键和从表的外键,形成主外键关系。

一种商品只会有一条详细的描述记录

在这里插入图片描述
  

一对多关系

  • 常见实例:客户和订单,分类和商品,部门和员工, 省份和城市

  • 一对多建表原则:在从表(多方)创建一个字段,字段作为外键指向主表(一方)的主键.

在这里插入图片描述

一个客户可以有多条购买记录

在这里插入图片描述
  

多对多关系

  • 常见实例:商品和订单,学生和课程,用户和角色

  • 多对多关系建表原则:需要创建第三张表,中间表中至少两个字段,这两个字段分别作为外键指向各自一方的主键

在这里插入图片描述

一个订单可能会购买多种商品,一种商品会出现在多个订单中

在这里插入图片描述

# 1.添加外键
ALTER TABLE orderitems  ADD CONSTRAINT orderiterms_orders_fk FOREIGN KEY (order_num) REFERENCES orders (order_num);
ALTER TABLE orderitems ADD CONSTRAINT orderiterms_products_fk FOREIGN KEY (prod_id) REFERENCES products(prod_id);
# 2.向订单表插入数据
INSERT INTO orders (order_num, order_date, cust_id) VALUES (101,now(),666);
# 3.向商品表插入数据
INSERT INTO products (prod_id,prod_name,vend_id,prod_price) VALUES (101,'大刀',1002,100);

# 4.向中间表插入一条数据(数据存在)
INSERT INTO orderitems(order_num, order_item, prod_id, quantity, item_price) VALUES (101,1,101,1,100);
# 5.向中间表插入一条数据(数据不存在)  执行失败
INSERT INTO orderitems(order_num, order_item, prod_id, quantity, item_price) VALUES (101,1,102,1,100);-- 产品表不存在102
INSERT INTO orderitems(order_num, order_item, prod_id, quantity, item_price) VALUES (102,1,101,1,100);-- 订单表不存在102
# 6.删除商品表   执行失败
DELETE FROM products WHERE prod_id=101;

  
  

实战1:省和市

  • 方案1:多张表,一对多

在这里插入图片描述

-- 创建省份表
create table province(
  pid int PRIMARY KEY,
  pname varchar(32), -- 省份名称
  description varchar(100) -- 描述
);

-- 创建城市表
create table city (
  cid int PRIMARY KEY,
  cname varchar(32), -- 城市名称
  description varchar(100), -- 描述
  province_id int,
  CONSTRAINT city_province_fk foreign key(province_id) references province(pid)
);
  • 方案2:一张表,自关联一对多

在这里插入图片描述

create table area (
  id int PRIMARY key AUTO_INCREMENT,
  `name` varchar(32),
  description varchar(100),
  parent_id int,
  CONSTRAINT area_area_fk FOREIGN KEY(parent_id) REFERENCES area(id)
);

INSERT into area values(null, '辽宁省', '这是一个省份', null);
INSERT into area values(null, '大连市', '这是一个城市', 1);
INSERT into area values(null, '沈阳市', '这是一个城市', 1);
INSERT into area values(null, '河北省', '这是一个省份', null);
INSERT into area values(null, '石家庄市', '这是一个城市', 4);
INSERT into area values(null, '保定市', '这是一个城市', 4);

  
  

实战2:用户和角色

  • 多对多关系

在这里插入图片描述

-- 用户表
create table `user` (
  uid varchar(32) PRIMARY KEY,
  username varchar(32),
  `password` varchar(32)
);

-- 角色表
create table role (
  rid varchar(32) PRIMARY KEY,
  rname varchar(32)
);

-- 中间表
create table user_role(
  user_id varchar(32),
  role_id varchar(32),
  CONSTRAINT user_role_pk PRIMARY KEY(user_id,role_id),
  CONSTRAINT user_id_fk FOREIGN KEY(user_id) REFERENCES `user`(uid),
  CONSTRAINT role_id_fk FOREIGN KEY(role_id) REFERENCES role(rid)
);

特别提醒

  现在这种创建外键的方式已经不提倡,甚至被禁止了。因为在维护数据时,每次做DELETE 或者UPDATE都必须考虑外键约束。限制条件太多,效率较低。关联关系通过SQL语句来实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/20529.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTML+CSS+JS网页设计期末课程大作业____(航天月球响应式 3页)

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材,DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 公司官网网站 | 企业官网 | 酒店官网 | 等网站的设计与制 | HTML期末大学生网页设计作业,Web大学生网页 HTML:结构 CSS&#…

【Java八股文总结】之Spring

文章目录Spring一、Spring介绍1、Spring是什么?特性?2、Spring有哪些模块?3、Spring中的设计模式?二、IOC1、基本概念2、什么是IOC?什么是DI?Q:为什么要使用 IOC 呢?3、Spring IOC的…

一文快速学会hadoop完全分布式集群搭建,很详细

文章目录前言一、准备工作二、克隆三台虚拟机并进行网络配置克隆虚拟机克隆引导修改网络配置验证验证方式一验证方式二三、安装jdk和hadoop四、ssh免密登录配置概述生成公钥和私钥把公钥拷贝到三台虚拟机上面去验证把hadoop103 和 hadoop104的免密登录配置安装上面的操作再做一…

ZYNQ - 无DDR固化程序(代码运行在OCM上)

写在前面 ZYNQ固化时,正常情况下都需要DDR参与,但是有时硬件设计时,可能将DDR去掉或设计出错,这将导致ZYNQ无法正常固化,之前有写过一个使用静态链接库进行无DDR固化的文章,当时那个是压缩了FSBL的相关代码…

yolov5剪枝实战3: yolov5-slimming项目运行演示

1. 下载项目文件 从百度网盘下载并解压 网盘地址,文末有链接:包括项目完整源代码、数据集、原理的课件说明等。 解压源码: yolov5-6.1-slimming.zip项目没有从yolov5 github上直接克隆项目文件,而是从百度网盘上下载项目文件并解压,因为yolov5原始的代码是没有带网络剪枝的,…

ElasticSearch - ​开启搜索的新境界

You Know, for Search ElasticSearch官网 开启搜索的新境界 Elasticsearch 是一个开源的搜索引擎,建立在一个全文搜索引擎库 Apache Lucene™ 基础之上。 Lucene 可以说是当下最先进、高性能、全功能的搜索引擎库。但是 Lucene 仅仅只是一个库。为了充分…

STM32+ MAX30102通过指尖测量心率+血氧饱和度

一、前言 重要的事情放在最前面:max30102只适用于指尖手指测量,不适用与手腕手指测量,如需做成可穿戴样式选择传感器的小伙伴请pass掉他,因为他只有红光和红外2种光,不够充足的数据源去运算。 由于一些原因&#xff0c…

个人开发者轻松接入支付回调

易支付(https://epay.jylt.cc)- 个人支付如此简单 随着技术的发展,现在个人构建一个网站的成本越来越低,越来越多的个人开发者拥有了自己的网站。个人搭建网站除了带来成就感之外如果能赚一些额外的收入岂不更好? 事…

多目标优化问题的研究概述(Matlab代码实现)

🍒🍒🍒欢迎关注🌈🌈🌈 📝个人主页:我爱Matlab 👍点赞➕评论➕收藏 养成习惯(一键三连)🌻🌻🌻 🍌希…

ECMAScript

介绍 JavaScript和ECMAScript的区别 html和css的解析在两款浏览器是不同的效果,比如一个页面能在IE解析,但是不能在网景浏览器解析 后面出现了脚本语言,JavaScript,提供了丰富功能,比如输入密码进行正则的判断提示 …

【算法】用动态规划求解背包问题

1.问题描述 有n种物品,每种物品的单件重量为w[i],价值为v[i]。现有一个容量为V的背包,如何选取物品放入背包,使得背包内物品的总价值最大。 下面是本题中我们使用的例子: 有三个物品,第一个物品的重量为3,…

【附源码】Python计算机毕业设计图书销售系统设计

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

用友vs金蝶产品分析(云星空与YonSuite)

产品定位 用友与金蝶二者面对的客户群体是相同的:都是为成长型企业提供一体化服务,由于金蝶云星空发展较早,在部分产品功能上具备一定的先发优势;在产品的架构上,由于YS采用目前最先进的云原生和微服务架构&#xff0…

Bootstrap(一)

目录: (1)bootstrap容器 1.简单框架使用 2.流体容器 3.固定容器 4.栅格系统 (1)bootstrap容器 1.简单框架使用 bootstrap-3.3.7、bootstrap-3.3.7-dist 是原码文件,带dist是编译完的,里面…

5.C语言常见运算符及其优先级

运算符 用算术运算符将运算对象(也称操作数)连接起来的、符合C语言规则的式子,称为C算术表达式。运算对象包括常量、变量、函数等。 例如:a * b / c - 1.5 ‘a’ 运算符的分类 1.双目运算符:即参加运算的操作数有两…

SpringBoot--获取路径中的参数(x-www-form-urlencoded)--方法/实例

原文网址:SpringBoot--获取路径中的参数(x-www-form-urlencoded)--方法/实例_IT利刃出鞘的博客-CSDN博客 简介 本文用示例介绍SpringMVC如何获取路径中的参数。也就是: Content-Type为x-www-form-urlencoded。 代码 Controller BasicController.java…

在线考试系统

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…

Prometheus邮件告警

一. 部署Alertmanager: 1. 解压Alertmanager压缩包: [rootnode5 ~]# tar xf alertmanager-0.24.0.linux-amd64.tar.gz -C /usr/local/ 2. 为解压后的文件做软连接: [rootnode5 ~]# ln -sv /usr/local/alertmanager-0.24.0.linux-amd64/ …

SSM整合(三)

redis之简单使用 1.准备工作 1.1 在resource资源文件夹下面创建redis.properties文件,并填写如下内容 #连接端口 redis.port6379 #连接地址 redis.host127.0.0.1 #超时时间:单位ms redis.timeout3000 #授权密码 redis.password #最大连接数:能够同时建…

GUI编程--PyQt5--QLineEdit

文章目录键盘文本输入框文本占位符密码显示与隐藏自动补全输入限制掩码字符光标移动设置文本区域常用编辑功能输入控件,用于捕获用户的信息键盘文本输入框 QLineEdit, 单行,纯文本输入框 # 实例化 文本输入框 le QLineEdit("默认值", windo…