【MySQL】多表操作、事务、索引

news2024/9/23 15:32:05

MySQL

  • MYSQL 多表设计 一对多
    • 插入测试数据
    • 外键约束(物理外键)
    • 使用逻辑外键
  • MYSQL 多表设计 一对一
    • 表结构
  • MYSQL 多表设计 多对多

MYSQL 多表设计 一对多

建表语句

员工表

CREATE TABLE tb_emp (
  id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT 'ID',
  username VARCHAR(20) NOT NULL UNIQUE COMMENT '用户名',
  password VARCHAR(32) DEFAULT '123456' COMMENT '密码',
  name VARCHAR(10) NOT NULL COMMENT '姓名',
  gender TINYINT UNSIGNED NOT NULL COMMENT '性别,说明: 1 男,2 女',
  image VARCHAR(300) COMMENT '图像',
  job TINYINT UNSIGNED COMMENT '职位,说明: 1 班主任, 2 讲师, 3 学工主管, 4 教研主管',
  entrydate DATE COMMENT '入职时间',
  dept_id INT UNSIGNED COMMENT '归属的部门ID',
  create_time DATETIME NOT NULL COMMENT '创建时间',
  update_time DATETIME NOT NULL COMMENT '修改时间'
) COMMENT '员工表';

部门表

CREATE TABLE tb_dept (
  id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT 'ID',
  name VARCHAR(10) NOT NULL UNIQUE COMMENT '部门名称',
  create_time DATETIME NOT NULL COMMENT '创建时间',
  update_time DATETIME NOT NULL COMMENT '修改时间'
) COMMENT '部门表';

插入测试数据

insert into tb_dept (id, name, create_time, update_time) values
(1,'学工部',now(),now()),(2,'教研部',now(),now()),(3,'咨询部',now(),now()),
(4,'就业部',now(),now()),(5,'人事部',now(),now());

INSERT INTO tb_emp
(id, username, password, name, gender, image, job, entrydate,dept_id, create_time, update_time) VALUES
(1,'jinyong','123456','金庸',1,'1.jpg',4,'2000-01-01',2,now(),now()),
(2,'zhangwuji','123456','张无忌',1,'2.jpg',2,'2015-01-01',2,now(),now()),
(3,'yangxiao','123456','杨逍',1,'3.jpg',2,'2008-05-01',2,now(),now()),
(4,'weiyixiao','123456','韦一笑',1,'4.jpg',2,'2007-01-01',2,now(),now()),
(5,'changyuchun','123456','常遇春',1,'5.jpg',2,'2012-12-05',2,now(),now()),
(6,'xiaozhao','123456','小昭',2,'6.jpg',3,'2013-09-05',1,now(),now()),
(7,'jixiaofu','123456','纪晓芙',2,'7.jpg',1,'2005-08-01',1,now(),now()),
(8,'zhouzhiruo','123456','周芷若',2,'8.jpg',1,'2014-11-09',1,now(),now()),
(9,'dingminjun','123456','丁敏君',2,'9.jpg',1,'2011-03-11',1,now(),now()),
(10,'zhaomin','123456','赵敏',2,'10.jpg',1,'2013-09-05',1,now(),now()),
(11,'luzhangke','123456','鹿杖客',1,'11.jpg',1,'2007-02-01',1,now(),now()),
(12,'hebiweng','123456','鹤笔翁',1,'12.jpg',1,'2008-08-18',1,now(),now()),
(13,'fangdongbai','123456','方东白',1,'13.jpg',2,'2012-11-01',2,now(),now()),
(14,'zhangsanfeng','123456','张三丰',1,'14.jpg',2,'2002-08-01',2,now(),now()),
(15,'yulianzhou','123456','俞莲舟',1,'15.jpg',2,'2011-05-01',2,now(),now()),
(16,'songyuanqiao','123456','宋远桥',1,'16.jpg',2,'2010-01-01',2,now(),now()),
	(17,'chenyouliang','123456','陈友谅',1,'17.jpg',NULL,'2015-03-21',NULL,now(),now());

外键约束(物理外键)

在这里插入图片描述
在这里插入图片描述

以上添加一个外键,将员工表的 dept_id 绑定至 部门表的 id 字段上
若无员工使用某个主表外键 id 则可以删除某个部门
不建议 \ 禁止 使用物理外键

概念: 使用 foreign key 定义外键关联另外一张表

缺点:
影响增、删、改的效率(需要检查外键关系)
仅用于单节点数据库,不适用与分布式、集群场景
容易引发数据库的死锁问题,消耗性能

使用逻辑外键

概念: 在业务层逻辑中,解决外键关联
通过逻辑外键,就可以很方便的解决上述问题

MYSQL 多表设计 一对一

案例: 用户 与 身份证信息 的关系
关系: 一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他字段放在另一张表中,以提升操作效率

实现: 在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE)

在这里插入图片描述

表结构

CREATE TABLE tb_user (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT 'ID',
    name VARCHAR(10) NOT NULL COMMENT '姓名',
    gender TINYINT UNSIGNED NOT NULL COMMENT '性别, 1 男  2 女',
    phone CHAR(11) COMMENT '手机号',
    degree VARCHAR(10) COMMENT '学历'
) COMMENT '用户信息表';

INSERT INTO tb_user VALUES 
    (1, '白眉鹰王', 1, '18812340001', '初中'),
    (2, '青翼蝠王', 1, '18812340002', '大专'),
    (3, '金毛狮王', 1, '18812340003', '初中'),
    (4, '紫衫龙王', 2, '18812340004', '硕士');


CREATE TABLE tb_user_card (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT 'ID',
    nationality VARCHAR(10) NOT NULL COMMENT '民族',
    birthday DATE NOT NULL COMMENT '生日',
    idcard CHAR(18) NOT NULL COMMENT '身份证号',
    issued VARCHAR(20) NOT NULL COMMENT '签发机关',
    expire_begin DATE NOT NULL COMMENT '有效期限-开始',
    expire_end DATE COMMENT '有效期限-结束',
    user_id INT UNSIGNED NOT NULL UNIQUE COMMENT '用户ID',
    CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES tb_user(id)
) COMMENT '用户信息表';

INSERT INTO tb_user_card VALUES 
    (1, '汉', '1960-11-06', '100000100000100001', '朝阳区公安局', '2000-06-10', NULL, 1),
    (2, '汉', '1971-11-06', '100000100000100002', '静安区公安局', '2005-06-10', '2025-06-10', 2),
    (3, '汉', '1963-11-06', '100000100000100003', '昌平区公安局', '2006-06-10', NULL, 3),
    (4, '回', '1980-11-06', '100000100000100004', '海淀区公安局', '2008-06-10', '2028-06-10', 4);

MYSQL 多表设计 多对多

案例: 学生与 课程的关系
关系: 一个学生可以选修多门课程,一门课程也可以供多个学生选择

实现: 建立第三张中间表,中间表至少包含两个外键,分别关联两方主键

在这里插入图片描述

CREATE TABLE tb_student(
    id INT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID',
    name VARCHAR(10) COMMENT '姓名',
    no VARCHAR(10) COMMENT '学号'
) COMMENT '学生表';
INSERT INTO tb_student(name, no) VALUES ('黛绮丝', '2000100101'),('谢逊', '2000100102'),('殷天正', '2000100103'),('韦一笑', '2000100104');


CREATE TABLE tb_course(
    id INT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID',
    name VARCHAR(10) COMMENT '课程名称'
) COMMENT '课程表';
INSERT INTO tb_course (name) VALUES ('Java'), ('PHP'), ('MySQL') , ('Hadoop');


CREATE TABLE tb_student_course(
    id INT AUTO_INCREMENT COMMENT '主键' PRIMARY KEY,
    student_id INT NOT NULL COMMENT '学生ID',
    course_id  INT NOT NULL COMMENT '课程ID',
    CONSTRAINT fk_courseid FOREIGN KEY (course_id) REFERENCES tb_course (id),
    CONSTRAINT fk_studentid FOREIGN KEY (student_id) REFERENCES tb_student (id)
)COMMENT '学生课程中间表';
INSERT INTO tb_student_course(student_id, course_id) VALUES (1,1),(1,2),(1,3),(2,2),(2,3),(3,4);

在这里插入图片描述

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

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

相关文章

10大数据恢复软件可以帮助您恢复电脑数据

您可能会非常紧张,因为知道有人意外地从您的硬盘驱动器中删除了您的宝贵数据(甚至使用 ShiftDelete 从回收站中删除),并且您确实需要这些数据,并且没有其他备份源可以在其中找到这些数据。不要担心,保持冷静…

Unity中URP实现水体效果(水的深度)

文章目录 前言一、搭建预备场景1、新建一个面片,使其倾斜一个角度,来模拟水底和岸边的效果2、随便创建几个物体,作为与水面接触的物体3、再新建一个面片,作为水面 二、开始编写水体的Shader效果1、新建一个URP基础Shader2、把水体…

编译GCC native编译器的几点启示

启示 编译 GCC native compiler按照官方介绍并不难 步骤见后面实践脚本,以及官方编译指南链接 GCC编译器编译其它程序组件时,会优先使用自身携带的库,例如,常用的自带库,libgcc_s.so、libstdc 如果部署环境与编译要求…

思维导图教你如何学会计算机组成原理

02 给你一张知识地图,计算机组成原理应该这么学 了解了现代计算机的基本硬件组成和背后最基本的冯诺依曼体系结构,我们就可以正式进入计算机组成原理的学习了。在学习一个一个零散的知识点之前,我整理了一份学习地图,好让你对将要…

目标跟踪之KCF详解

High-Speed Tracking with Kernelized Correlation Filters 使用内核化相关滤波器进行高速跟踪 大多数现代跟踪器的核心组件是判别分类器,其任务是区分目标和周围环境。为了应对自然图像变化,此分类器通常使用平移和缩放的样本补丁进行训练。此类样本集…

第三篇:CamX日志打印系统

第三篇:CamX日志打印系统 高通camx的日志主要分2大模块,UMD (user mode driver) 和KMD( kerner mode driver),也就是用户层和kernel层日志。 下面就来看下这2大块日志debug的时候该如何设置? 一、UDM日志 高通camx camera debug日志格式如下: CamX: [][] : . 例子:Ca…

【C++】类与对象—— 初始化列表 、static 静态成员、

类与对象 1 再谈构造函数1.1 构造函数体赋值1.2 初始化列表语法:建议:初始化顺序:注意: 1.3 explicit关键字 2 static 静态成员2.1 概念2.2 声明成员变量2.3 使用类的静态成员2.4 定义静态成员总结 Thanks♪(・ω&#…

提高自定义词汇表上的 RAG 性能

原文地址:improve-rag-performance-on-custom-vocabulary Code:Improve RAG performance on custom vocabulary.ipynb 2024 年 2 月 9 日 糟糕的检索系统会导致混乱、沮丧和幻觉。 新的嵌入模型比以往更加强大。我们根据 MTEB 等基准对其进行了全面评…

go 1.18 不同目录package引用问题

go 1.18开始使用module了 不同的package在vs code中引用的话 需要先开启 是Go1.11版本之后 推出的版本管理工具 有点类似java的 maven工具 可以引入依赖使用 go env -w GO111MODULEon 先把这个打开 然后在创建的vs code工作目录下 执行 module gomdoule module 模块名 会生…

前后端分离Vue+nodejs校园论坛bbs系统x450z

开发语言 node.js 框架:Express 前端:Vue.js 数据库:mysql 数据库工具:Navicat 开发软件:VScode本论文拟采用计算机技术设计并开发的论坛bbs系统,主要是为用户提供服务。使得用户可以在系统上查看帖子信息、签到积分等…

unity hub (第一部)初学配置

1、安装Unity Hub 2、设置中文 3、安装编辑器 4、新建项目 5、新建完成后进入编辑器 6、 编辑器设置中文 editPreferencesLanguages选择中文

数学建模资料分享

1. 往年各赛题的优秀论文 可以用来参考一下论文是怎么写的。参考论文的结构,格式,思路等等。 链接:https://pan.baidu.com/s/1WG2t4-x9MjtaSgkq4ue5AQ?pwdnlzx 提取码:nlzx --来自百度网盘超级会员V4的分享 2.论文模板 链接&a…

学习JAVA的第二天(基础)

目录 基本概念 关键字 class关键字 字面量 练习 变量 定义格式 变量使用 数据类型 基本数据类型 标识符 命名规则 键盘录入 1.导包 2.创建对象 3.接受数据 运算符 算术运算符 练习 隐式转换(自动类型提升) 强制转换 自增自减运算符 …

众安保险基于Apache SeaTunnel的生产应用实践

*> 文|曾力 众安保险大数据开发高级专家 编辑整理| 曾辉* 前言 众安保险从2023年4月就开始了数据集成服务的预研工作,意在通过该服务解决当前数据同步场景下的两大痛点,服务化能力薄弱和无分布式同步能力。我们对多种开源数据…

【Java程序设计】【C00291】基于Springboot的网上图书商城(有论文)

基于Springboot的网上图书商城(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的网上图书商城 本系统分为系统功能模块、管理员功能模块以及卖家功能模块。 系统功能模块:在系统首页可以查看首页、图书…

社区志愿者齐心协力,为社区居民营造温馨和谐环境

近日,在我们的社区里,一场温暖而有力的力量正在悄然兴起。一群热心居民自发组织成为社区志愿者团队,积极投身于服务社区的各项活动中,为居民们营造了一个温馨和谐的生活环境。 在每个周末的清晨,志愿者们早早地聚集在社…

匿名+有名管道

管道 相关概念 4种情况 正常情况,如果管道没有数据,读端陷入等待,直到有数据才能唤醒正常情况,如果管道被写满,写端陷入等待,直到有空间才能唤醒写段关闭,读端一直读取,read返回0…

Linux Android USB gadget(从设备驱动)

Linux Android USB gadget 一:Linux usb gadget 与 Android Composite Gadget二:原生方式和Android方式如何配置函数调用逻辑内核配置原生驱动android驱动三:mass_storage配置虚拟化U盘四:遍历usb设备五:adb usb判断usb设备为adb获取adb配置信息adb设备序列号发送与接收《Linux…

一键生成PDF即刻呈现:轻松创建无忧体验

在信息爆炸的时代,我们每天都在与各种文件、资料打交道。无论是工作中的报告、合同,还是学习中的笔记、论文,如何高效、安全地管理这些珍贵的资料,成为了我们迫切的需求。幸运的是,随着科技的发展,我们不再…

在Linux系统上实现高效安装与部署环境的全方位指南

前言 在数字化时代,Linux操作系统以其高度的灵活性、安全性和稳定性,成为了众多开发者和系统管理员的首选。然而,要想充分发挥Linux系统的优势,一个高效、稳定、易于管理的安装与部署环境至关重要。本文旨在为广大Linux爱好者、初…