mysql数据库(下)

目录

约束

约束的概念和分类

1、约束的概念:

2、约束的分类

1、主键约束

2、默认约束

 3、非空约束

4、唯一约束

5、外键约束


约束

约束的概念和分类

1、约束的概念:

  • 约束时作用于表中列上的规则,用于限制加入表的数据
  • 约束的存在保证了数据库中数据的正确性、有效性和完整性

2、约束的分类

 练习:

CREATE TABLE emp(
    id INT PRIMARY KEY,
    ename VARCHAR(50) NOT NULL UNIQUE,
    joindate DATE NOT NULL,
    salary DOUBLE(7,2) NOT NULL,
    bonus DOUBLE(7,2) DEFAULT 0
);

insert into emp(id,ename,joindate,salary,bonus) VALUES(1,'张三','1999-11-11',8800,5000);

--------------------------------------------------------------------------------------------------- 

1、测试主键约束  非空且唯一(将id的1改为了null)

又运行了一遍已有的,显示[Err] 1062 - Duplicate entry '1' for key 'PRIMARY'

--------------------------------------------------------------------------------------------------------------

2、测试非空约束 不能为null

测试主键的时候已经测试了不能为空,这里就不演示啦

--------------------------------------------------------------------------------------------------------------

3、测试唯一约束 表中所有数据各不相同

这里也是,主键的时候测试了以下,也就不演示啦

--------------------------------------------------------------------------------------------------------------

4、测试默认约束 未指定值则采用默认值

这里我把bonus和5000 去掉了,我们看看结果是什么

取值为默认值0

只有不添加任何值的时候默认约束才能生效,输入null的话,显示的就是null。我们来看一下

显示的就是null,而不是0;

--------------------------------------------------------------------------------------------------------------

5、测试自动增长:auto_increment 当列是数字类型并且唯一约束

这里我们得重新建表

drop table if EXISTS emp;
CREATE TABLE emp(
    id INT PRIMARY KEY auto_increment,
    ename VARCHAR(50) NOT NULL UNIQUE,
    joindate DATE NOT NULL,
    salary DOUBLE(7,2) NOT NULL,
    bonus DOUBLE(7,2) DEFAULT 0
);

没加数据的就把前面的id删了

我们看一下结果如何

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~·

在建完表后如果要添加约束的话,我们该如何取写代码

1、主键约束

alter table 表名 add primary key(字段名);

删除约束:

alter table 表名 drop index 字段名; 

2、默认约束

alter table 表名 alter 列名  set  default 默认值;

 删除约束

alter table 表名 alter 列名 drop default; 

 3、非空约束

alter table 表名 modify 字段名 数据类型 not null;

删除约束:

alter table 表名 modify 字段名 数据类型; 

4、唯一约束

alter table 表名 modify 字段名 数据类型 unique; 

删除约束

alter table 表名 drop index 字段名; 

5、外键约束

外键用来让两个表的数据之间建立链接,保证数据的一致性和完整性

添加约束

创建时添加外键约束

create table 表名(

        列名 数据类型,

        .....

        [constraint][外键名称] foreign key (外键字段名) references 主表名称(主表列名称)

);

建完表后添加外键约束

alter table 表名 add constraint 外键名称 foreign key  (外键字段名) references 主表名称(主表列名称)

删除约束:

alter table 表名 drop foreign key 外键名称; 

添加外键dep_id,关联dept表的主键

代码在这哦

CREATE table dept(
id int PRIMARY key auto_increment,
dep_name varchar(20),
addr varchar(20)
);
create table emp(
id int PRIMARY key auto_increment,
name varchar(20),
age int,
dep_id int,
CONSTRAINT fk_emp_dept FOREIGN key(dep_id) REFERENCES dept(id)
);

 insert into dept(dep_name,addr) VALUES('研发部','广州'),('销售部','深圳');

insert into emp(name,age,dep_id) VALUES('张三',20,1),('李四',20,1),('王五',20,1),('赵六',20,2),('孙七',22,2),('周八',18,2);

这样就不能删除dept表中的数据了

会显示有外键的约束

但如果我想要删除研发部,那就得先删除张三李四王五三条数据

这样就可以删除研发部了

----------------------------------------------------------------

在对象中按住ctrl选中这两张表

再点击逆向表到模型 

就能看到这俩张是有个外键约束着的

 

删除外键:

alter table emp drop FOREIGN key fk_emp_dept;

这样两张表中的线就没了

创建过表之后添加外键:

alter table emp add CONSTRAINT fk_emp_dept FOREIGN key(dep_id) REFERENCES dept(id);

数据库设计

表关系 

  • 一对一:

如:用户和用户详情  

一对一关系多用于表拆分,将一个实体中经常使用的字段放一张表,不经常使用的字段放另一张表,用于提升查询性能

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

  • 一对多(多对一):

如:部门和员工(一个部门可以对应多个员工,一个员工对应一个部门)

实现方式:在多的一方建立外键,指向一的一方的主键

  • 多对多: 

如:商品和订单(一个商品对应多个订单,一个订单包含多个商品)

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

多表查询

多表查询:从多张表中查询数据

连接查询

内连接:相当于查询A、B的交集数据

外连接:

         左外连接:相当于查询A表所有数据和交集部分的数据

         右外连接:相当于查询B表所有数据和交集部分的数据

子查询

对于这两张表,我们如果直接用

select * from emp,dept;

查询的话会显示24条数据

这就涉及到了笛卡尔积:有A、B两个集合,取A、B所有的组合情况

我们得消除无效数据,就得设置一个条件emp.dep_id=dept.did

 这其实就是连接查询中内连接的一种

内连接

隐式内连接

select 字段列表 from 表1,表2... where 条件;

查询 emp表的name,sex和dept表的dname

显示内连接

select 字段列表 from 表1 [inner] join 表2 on 条件;

 这里的inner可以省略

 外连接

左外连接

select 字段列表 from 表1 left [outer] join 表2 on 条件;

右外连接

select 字段列表 from 表1 right [outer] join 表2 on 条件;

子查询 

查询中嵌套查询,称嵌套查询为子查询

子查询根据查询的结果不同,作用不同: 

  • 单行单列:作为条件值,使用= 、!=、> 、<等进行条件判断

select 字段列表 from 表 where 字段名 = (子查询);

  • 多行单列:作为条件值,使用in等关键字进行条件判断

select 字段列表 from 表 where 字段名 in (子查询);

  • 多行多列:作为虚拟表

select 字段列表 from (子查询) where 条件;

下面来看例子

查询 猪八戒的工资

查询工资高于猪八戒的员工信息

但如果我们要将二者合二为一也是可以的

图中划红线的就是子查询

多行单列子查询👇

多行多列子查询 

 这里的t1是取的别名

-------------------------------------------------------------------------------------------------------------------------

事务

事务简介

  • 数据库的事务(Transaction)是一种机制、一个操作序列,包含了一组数据库操作命令
  • 事务把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么同时成功,要么同时失败
  • 是事务是一个不可分割的工作逻辑单元

数据库事务是指由一系列的数据库操作组成的逻辑单元,这些操作要么全部成功执行,要么全部失败回滚。事务具有以下四个特性:

  1. 原子性(Atomicity):事务中的操作要么全部成功执行,要么全部失败回滚。事务是一个不可分割的工作单位。

  2. 一致性(Consistency):事务执行后,数据库从一个一致性状态转换到另一个一致性状态。事务执行过程中,数据库的约束条件始终被满足。

  3. 隔离性(Isolation):事务的执行是相互隔离的,一个事务的执行结果对其他事务是不可见的。事务之间不会相互干扰。

  4. 持久性(Durability):事务执行成功后,对数据库的修改是永久性的。

数据库事务能够保证数据的完整性和一致性,减少数据的冲突和错误。在高并发的系统中,使用数据库事务可以确保数据的正确处理和操作的原子性。

开启事务

START TRANSACTION; 或者BEGIN;

提交事务

COMMIT; 

回滚事务

ROLLBACK; 

 来做个案例试试,代码给大家放在这里啦

drop table if exists account;
CREATE table account(
id int PRIMARY key auto_increment,
name varchar(10),
money DOUBLE(10,2)
);
insert into account(name,money) VALUES('张三',1000),('李四',1000); 

 接下来我们在两条语句中加一句话,制造异常

这就会报错,我们来看一下数据有没有被修改

 

李四的数据被修改了,报错下面的语句就没有被执行了

然后我们新建了一个查询模仿别人是否可以看到数据的变化

结果显示,也发生了变化

接下来我们将数据还原并开启事务看看会发生什么

我们来看看数据有没有被修改呢

被修改了,我们再看看新建查询里查询的数据有没有被修改

数据并没有被修改

我们开启事务之后,做的那些操作都是一些临时性的操作,在我们当前的用户窗口里可以查到,但是在其他的用户窗口里是查不到的

出错了之后我们就要取回滚事务

在当前窗口数据就恢复了,回滚到事务开始之前的状态

然后我们解决问题,将出错了注释掉之后,问题就解决了

没有问题我们就用commit提交事务,数据就会被持久性的更改

 Mysql事务默认自动提交

查看事务的默认提交方式

select @@autocommit;

1为自动提交

0为手动提交 

修改事物的提交方式

set @@autocommit=0;

这里我们执行以下看看

 

当前窗口的数据被修改了

那我们看看新建的窗口如何

数据没有被改变,因为我们把事务提交改为了手动提交,mysql就不帮我们自动提交了 

执行了commit之后数据才能生效

 

别人也可以看到数据被修改了

到这里也就结束啦,大家继续加油哦,继续努力!!!

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

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

相关文章

当时说大概率在面试不会出的题目,在旷视二面出了

旷视科技 面试原题 昨天在翻看读者历史留言的时候&#xff0c;无意看到一条几个月前的留言。 当时这位读者投稿了旷视科技的二面算法原题。 而投稿的题目&#xff0c;我印象很深&#xff0c;当时我还在日更 LC 题解的时候&#xff0c;曾作为 LC 每日一题出过。 那天还有群里小伙…

苍穹外卖学习-----2024/03/010---redis,店铺营业状态设置

1.Redis入门 2.在Java中操作Redis 3.店铺营业状态设置 BUG!!! 今天在启动项目时&#xff0c;用到了Redis缓存数据库&#xff0c;但是却出现了报错信息&#xff1a; ERR Client sent AUTH, but no password is set。Caused by: io.lettuce.core.RedisCommandExecutionException…

倒计时31天

1.C-李渊的准备_第十四届南京工程学院程序设计及应用竞赛校外同步赛 (nowcoder.com) #include<bits/stdc.h> using namespace std; #define int long long const int N2e56; const int inf0x3f3f3f3f; typedef pair<int,int> pii; bool cmp(pii x,pii y) {return …

mysql笔记:17. 数据库编程

文章目录 一、存储过程1. 创建存储过程2. 查看存储过程3. 调用存储过程4. 修改存储过程5. 删除存储过程 二、函数1. 创建自定义函数2. 查看自定义函数3. 调用自定义函数4. 删除自定义函数 为了提高SQL语句的重用性&#xff0c;MySQL可以将频繁使用的业务逻辑封装成程序进行存储…

Java后端八股文之java基础

文章目录 0.Java 中有 8 种基本数据类型1. 为什么浮点数运算会丢失精度&#xff1f;如何解决&#xff1f;2. 面向对象的三大特征2.1 封装2.2 继承2.3 多态 3. 深拷贝和浅拷贝的区别&#xff1f;什么是引用拷贝&#xff1f;4. equals方法与“”方法4.1 4.2 equals方法 5.hashcod…

第十一篇 - 应用于市场营销视频场景中的人工智能和机器学习技术 – Video --- 我为什么要翻译介绍美国人工智能科技巨头IAB公司(1)

IAB平台&#xff0c;使命和功能 IAB成立于1996年&#xff0c;总部位于纽约市。 作为美国的人工智能科技巨头社会媒体和营销专业平台公司&#xff0c;互动广告局&#xff08;IAB- the Interactive Advertising Bureau&#xff09;自1996年成立以来&#xff0c;先后为700多家媒体…

Vue2和vue3的区别(前端面试常见问题)

1.Api的变化&#xff1a;vue3使用组合式Api&#xff08;compostion Api&#xff09;和Vue2是选项式Api&#xff08;options Api&#xff09;。选项式Api具有data &#xff0c;watch&#xff0c;methods&#xff0c;computed&#xff0c;一个个的模块。如果代码过多可读性会很差…

【Linux】基于Kubernetes部署最新版AWX

目录 前言一、安装1.安装K3S2.提前导入redis、PG镜像3.安装AWX4.启动web页面5.卸载干净 二、使用1.登陆密码2.中英文切换3.查看当前版本 三、总结 前言 我们都听过Ansible&#xff0c;它本质上是一个进行了封装的Shell&#xff0c;优点在于它是去中心化的工具&#xff0c;可以…

android 简单快速 自定义dialog(简单好用,不需要设置样式)

1.MyDialog代码&#xff1a; public class MyDialog{private Activity activity;private ViewGroup contentView;private View view;public MyDialog(Activity activity) {this.activityactivity;contentView activity.findViewById(android.R.id.content);viewLayoutInflate…

RabbitMQ学习总结-消息的可靠性

保证MQ消息的可靠性&#xff0c;主要从三个方面&#xff1a;发送者确认可靠性&#xff0c;MQ确认可靠性&#xff0c;消费者确认可靠性。 1.发送者可靠性&#xff1a;主要依赖于发送者重试机制&#xff0c;发送者确认机制&#xff1b; 发送者重试机制&#xff0c;其实就是配置…

安泰高压放大器应用领域包括哪些方面

高压放大器是一种关键的电子器件&#xff0c;广泛应用于多个领域&#xff0c;以放大高电压信号&#xff0c;满足不同应用的需求。这些放大器能够处理高电压信号&#xff0c;同时保持信号质量和可靠性。下面安泰电子将为大家介绍高压放大器的各种应用领域&#xff0c;以便更好地…

Django 简介

Django 简介 基本介绍 Django 是一个由 Python 编写的一个开放源代码的 Web 应用框架。 Django 是一个高级的 Python Web 框架&#xff0c;用于快速开发可维护和可扩展的 Web 应用程序。 使用 Django&#xff0c;只要很少的代码&#xff0c;Python 的程序开发人员就可以轻松…

2014

1,写出计算Ack(m,n)的递归算法 #include<iostream> using namespace std; int A(int m,int n){if(m0){return n1;}else if(m>0&&n0){return A(m-1,1);}else{return A(m-1,A(m,n-1));} }int main(){int m,n;cout<<"please input two number"&l…

数字人基础 | 3D手部参数化模型2017-2023

楔子: 2017年年底的泰国曼谷, SIGGRAPH Asia会议上, 来自马普所的 Javier Romero, Dimitrios Tzionas(两人都是 Michael J. Black的学生)发布了事实性的手部参数化模型标准: MANO [1]。 MANO的诞生意味着 Michael J. Black团队在继人体参数化模型 SMPL后, 事实性的将能够表达人…

拓展欧几里得算法

一、拓展欧几里得算法 1.1 算法简析 根据裴蜀定理&#xff0c;对任意 a a a 和 b b b&#xff0c;一定存在 x x x 和 y y y&#xff0c;使 a x b y gcd ( a , b ) ax by \text{gcd}(a, b) axbygcd(a,b)。拓展欧几里得算法不仅能求出 a a a 和 b b b 的最大公约数&…

java实现计算ROUGE-L指标(一)

ROUGE (Recall-Oriented Understudy for Gisting Evaluation) 是用于评估自动文摘或机器翻译的一种评估方法&#xff0c;其中的ROUGE-L指标是基于最长公共子序列&#xff08;Longest Common Subsequence&#xff0c;LCS&#xff09;来计算的 我们做AI问答系统&#xff0c;需要一…

访问学者申请记|美国首所翻译博士点

N老师出国访学的目的一方面是开拓眼界&#xff0c;另一方面也是为完成翻译方向的博士论文创造更好的条件。最终我们获得美国纽约州立大学宾汉姆顿分校的邀请函&#xff0c;该校的“翻译研究和教学项目”&#xff08;TRIP&#xff09;是美国高校设立的第一个翻译博士学位项目&am…

JavaScript进阶3之参数按值传递、call,apply,bind和new的实现、继承的多种方式

JavaScript基础 参数按值传递按值传递共享传递 call、apply、bind和new的实现this软绑定硬绑定 call的实现第一步第二步第三步 apply的实现bind的实现返回函数的模拟实现传参的模拟实现构造函数效果的模拟实现构造函数效果的优化实现 new的实现初步实现 继承的多种方式&优缺…

(学习日记)2024.03.09:UCOSIII第十一节:就绪列表

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

计算机网络 —— 运输层

运输层 5.1 运输层概述 运输层的主要任务是&#xff0c;如何为运行在不同主机上的应用进程提供直接的通信服务。运输层协议又称为端到端协议。 根据应用需求的不同&#xff0c;因特网的运输层为应用层提供了两种不同的运输协议&#xff0c;即面向连接的TCP和无连接的UDP 5.2…