MySQL多表操作--外键约束多表关系

  • 外键约束介绍

    Mysql外键约束(foreign key)是表的一个特殊字段,常与主键约束一起使用。外键约束是一种用于维护两个表之间数据一致性的方法。它确保引用表中的每个值都存在于主表中的某个列中。外键约束通常用于实现数据库的参照完整性。对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)。

  • 定义外键的规则

    1、主表必须已经存在于数据库中,或者是当前正在创建的表。

    2、必须为主表定义主键。

    3、主键不能包含空值,但允许在外键中出现空值。

    4、在主表的表名后面指定列名或列名的组合,这个列或列的组合必须是主表的主键。

    5、外键中列的数目必须和主表的主键中列的数目相同。

    6、外键中列的数据类型必须和主表主键列的数据类型相同。

  • 外键约束的创建步骤

    方式1:在创建表时设置外键约束

    [constraint <外键名>] foreign key (字段名 [,字段名2,...]) references <主表名>(主键列1 [,主键列2,...])
    

    方式2:通过 alter…add字段添加,前提是从表中外键列中的数据必须与主表中主键列的数据一致或是还没有数据

    alter table <表名> add constarint <外键名> foreign key(<列名>) references <主表名>(<列名>)
    

    eg1:一对多关系表中创建外键约束

    create database db; --创建数据库db
    use db;-- 创建部门表(主表)
    create table if not exists department(deptno varchar(8) primary key comment '这是部门编号',depname varchar(16) --这是部门编号
    )charset=utf8;-- 创建员工表(从表)
    create table if not exists staff(sid varchar(16) primary key, --员工编号sname varchar(16), --员工姓名age int, --员工年龄dep_id varchar(8), --员工所属部门编号foreign key (dep_id) references department(deptno)
    )charset=utf8;
    

    eg2:多对对关系表中外键约束的创建通常会利用中间表将两个表进行关联。如学生表和课程表,一名学生可以选多门课程,一门课程也可以被多名学生选择

    -- 创建学生表(主表1)
    create table [if not exists] students(sid int primary key auto_increment, -- 将学号设为自增主键sname varchar(16),age int,gender enum('男','女') default '男'
    )charset=utf8;-- 创建课程表(主表2)
    create table course(cid int primary key auto_increment, -- 将课程id设为自增主键cname varchar(32)
    )charset=utf8;-- 创建中间表mid_stu_course
    create table mid_stu_course(sid int,cid int,score double
    )charset=utf8;-- 分2次建立外键约束
    alter table mid_stu_course add foreign key(sid) references students(sid);
    alter table mid_stu_course add foreign key(cid) refernces course(cid);-- 插入数据时,中间表中的sid和cid需存在于主表中,即只能在主表的sid和cid的值中选择
    
  • 在外键约束条件下的数据操作

    1、数据插入:

    – 必须先给主表添加主键列(外键约束列)的数据

    – 给从表添加数据时,外键列的值必须依赖主表的主键列。即从表外键列插入的数据必须存在于主表主键列。

    2、删除数据:

    – 从表的数据可以任意删除

    – 主表的数据被从表依赖时不能被删除,未被依赖的数据才可以删除。

  • 删除外键约束

    alter table table_name drop foreign key <外键约束名>;
    

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

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

相关文章

LeetCode 1343.大小为K且平均值大于等于阈值的子数组数目

题目&#xff1a; 给你一个整数数组 arr 和两个整数 k 和 threshold 。 请你返回长度为 k 且平均值大于等于 threshold 的子数组数目。 思路&#xff1a;定长滑动窗口 入 更新 出 代码&#xff1a; class Solution {public int numOfSubarrays(int[] arr, int k, int t…

Electron-(二)桌面应用的启动动画创建

一、概述 在很多桌面应用中都会有启动画面的显示。启动画面可以解决在启动时耗时较长&#xff0c;将每一步反馈给用户。另外一方面解决启动过程中的环境检查及检查结果的反馈。 在当今的桌面应用领域&#xff0c;启动动画已成为提升用户体验的重要组成部分。它不仅仅是一个简单…

【Linux】main函数的参数列表从何而来?

Linux系统进程通过exec系列函数启动新程序时&#xff0c;argc整型 、 argv数组 和 环境变量表 environ 会作为 exec 系列函数的参数&#xff0c;显式传递给新程序的 main 函数。 main函数的参数列表 在C语言中&#xff0c;main函数的标准参数列表通常如下所示&#xff1a; in…

极客wordpress模板

这是一个展示WordPress主题的网页设计。页面顶部有一个导航栏&#xff0c;包含多个选项&#xff0c;如“关于我们”、“产品中心”、“案例展示”、“新闻动态”、“联系我们”和“技术支持”。页面中间部分展示了多个产品&#xff0c;每个产品都有一个图片和简短的描述。页面下…

MySQL【知识改变命运】06

前言&#xff1a;在05这节数据结构里面&#xff0c;我们知道select * from 这个操作很危险&#xff0c;如果数据库很大&#xff0c;会把服务器资源耗尽&#xff0c;接下来提到的查询可以有效的限制返回记录 1&#xff1a;分页查询 分页查询可以有效控制一次查询出来的结果集的…

AutoSar AP CM原始数据流传输接口总结

一、原始数据流传输接口概述 自适应 AUTOSAR 通信管理通常基于面向服务的通信&#xff0c;但对于高级驾驶辅助系统&#xff08;ADAS&#xff09;应用&#xff0c;高效传输原始二进制数据流很重要&#xff0c;原始数据二进制流 API 为此提供了解决方案。它能与车辆外部传感器高…

【CTF刷题9】2024.10.19

[MoeCTF 2021]babyRCE 考点&#xff1a;关键词过滤&#xff08;绕过方法参考往期博客&#xff09; 来源&#xff1a;nssctf <?php$rce $_GET[rce]; if (isset($rce)) {if (!preg_match("/cat|more|less|head|tac|tail|nl|od|vi|vim|sort|flag| |\;|[0-9]|\*|\|\%|\&g…

TiDB 关联子查询及半连接的优化实践

作者&#xff1a; 数据源的TiDB学习之路 原文来源&#xff1a; https://tidb.net/blog/e9563a23 导读 TiDB 针对子查询语句会执行多种 子查询相关的优化 &#xff0c;以提升子查询的执行性能。半连接语句和关联子查询语句是常用的两类子查询&#xff0c;TiDB 优化器默认包…

《浙江工业大学学报》

《浙江工业大学学报》 国际标准刊号&#xff1a;ISSN 1006-4303&#xff0c;国内统一刊号&#xff1a;CN 33-1193/T。 本刊主要报道本校各学科最新的研究成果&#xff0c;并择优刊登相关学科的外稿。覆盖的学科主要有化学工程、机械工程、信息工程、建筑工程以及生物与环境工…

图像中的数值计算

目录 图像读取与形状图像数据展示图像数据操作超出范围的像素值处理 图像读取与形状 使用cv2.imread函数读取图像文件。图像的形状通过shape属性获取&#xff0c;格式为(高度, 宽度, 颜色通道数)。 import cv2img1 cv2.imread(bg.jpg) img2 cv2.imread(fish.jpg)print(img1…

Linux服务器安装SRAToolkit教程

SRAToolkit是由NCBI&#xff08;美国国家生物技术信息中心&#xff09;提供的一个工具集&#xff0c;用于下载、读取和转换SRA&#xff08;Sequence Read Archive&#xff09;格式的数据文件。这些数据文件包含了大规模的核酸序列数据&#xff0c;对于基因组学研究至关重要。本…

pytorch激活函数介绍

在 PyTorch 中,激活函数(Activation Functions)是神经网络中重要的非线性组件,用于引入非线性,使网络能够学习复杂的函数关系。以下是 PyTorch 中常见的激活函数及其特点: 1. ReLU (Rectified Linear Unit) 函数: torch.nn.ReLU()公式: ReLU(x)=max⁡(0,x)特点: 常用于隐…

python-代码技巧

python-代码技巧 简单tips1、多个列表循环遍历2、使用map对列表中多个文件进行批量操作 仅个人笔记使用&#xff0c;感谢点赞关注 简单tips 1、多个列表循环遍历 dataTypes ["train","test"] dataStations ["1","2","3"…

Bean的实例化方式

1. 通过构造方法实例化&#xff08;Constructor Instantiation&#xff09; 这是最常见的方式&#xff0c;Spring通过调用类的构造方法来创建Bean实例。 XML配置示例 <bean id"userDao" class"com.example.UserDao" />Spring容器在加载时调用User…

【C语言】自定义类型:结构体--结构体内存对齐(用于计算结构体的大小)

结构体内存对齐 结构体内存对齐用于计算结构体的大小。 &#xff08;1&#xff09;对齐规则 1&#xff09;&#xff09;结构体的第一个成员对齐到和结构体变量起始位置偏移量为0的地址处。 2&#xff09;&#xff09;其他成员变量要对齐到某个数字&#xff08;对齐数&#…

C++中的vector使用与实现

一、vector的使用 1.1 vector的定义 是一种类模板 template < class T, class Alloc allocator<T> > class vector; 其中的模板参数Alloc是在使用空间配置器&#xff08;内存池&#xff09;&#xff0c;并给了缺省值&#xff0c;暂时不深究 1.2遍历方式 1.…

FFmpeg 4.3 音视频-多路H265监控录放C++开发四 :RGB颜色

一 RGB 的意义&#xff1f; 为什么要从RGB 开始讲起呢&#xff1f; 因为最终传输到显卡显示器的颜色都是RGB 即使能处理YUV的API&#xff0c;本质上也是帮你做了从 YUV 到 RGB的转换。 RGB888 表示 R 占8bit&#xff0c;G 占8bit&#xff0c;B 占8bit&#xff0c;也就是每一…

Gin框架操作指南10:服务器与高级功能

官方文档地址&#xff08;中文&#xff09;&#xff1a;https://gin-gonic.com/zh-cn/docs/ 注&#xff1a;本教程采用工作区机制&#xff0c;所以一个项目下载了Gin框架&#xff0c;其余项目就无需重复下载&#xff0c;想了解的读者可阅读第一节&#xff1a;Gin操作指南&#…

STM32端与C#端的连接与交互[外设][代码记录]

1. 通过UART串口进行通信 STM32 端代码&#xff08;UART通信&#xff09;&#xff1a; #include "stm32f1xx_hal.h"UART_HandleTypeDef huart1;void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_USART1_UART_Init(void);int main(v…

手撕布隆过滤器:原理解析与面试心得

前言 说来话长&#xff0c;话来说长。前些天我投了一些日常实习的简历&#xff0c;结果足足等了两个礼拜才收到面试通知&#xff0c;看来如今的行情确实是挺紧张的。当时我是满怀信心去的&#xff0c;心想这次一定要好好拷打面试官一番&#xff0c;结果没想到&#xff0c;自我…