数据库的增删改查(2)

news2024/11/24 22:58:01

1、数据库约束

关系型数据库的一个重要功能

主要作用是保证数据的完整性,也就是数据的正确性(数据本身是正确的,关联关系也是正确的)

人工检查数据的完整性的工作量非常的大,在数据表定义一些约束,那数据库在写入数据时,帮我们完成这个工作

1.1、约束类型

*NOT NULL -指示某列不能存储NULL值

*UNIQUE -保证某列的每行必须由唯一的值

*DEFAULT -规定没有给列赋值时的默认值

*PRIMARY KEY - NOT NULL和UNIQUE的结合。确保某列(或两个列多个列的结合)唯一的标识,有助于更容易更快速的找到表中的一个特定的记录

*FOREING KEY - 保证一个表中的数据匹配到另一个表中的值的参照完整性

*CHECK - 保证每列的值都符合指定的条件。对于MySQL数据库,对CHECK子句进行分析,但是忽略CHECK子句

1.2、NULL 约束

*创建表时可以指定某列不能为空

-- 重新设置学生表结构

DROP TABLE IF EXISTS student;
CREATE TABLE student (
             id INT NOT NULL,
             sn INT,
             name VARCHAR(20),
             qq_mail VARCHAR(20)
);

 

 1.3、UNIQUE:唯一约束

保证某列的每一行必须有唯一的值(某一列的值不能重复)

-- 重新设置表结构

DROP TABLE IF EXISTS student;

create table student(

                  id int NOT NULL,

                  sn int UNIQUE,

                  name VARCHAR(20),

                  qq_mail VARCHAR(20)

);

 1.4、DEFAULT:默认值约束

*规定没有给列赋值时的默认值

-- 重新设置表结构

DROP TABLE IF EXISTS student;

create table student(

                  id int NOT NULL,

                  sn int UNIQUE,

                  name VARCHAR(20) DEFAULT '无名氏',

                  qq_mail VARCHAR(20)

);

 1.5、PRIMARY KEY:主键约束

主键帮我们做了两个检验,一个是非空,一个是唯一校验

*指定id列为主键:

-- 重新设置表结构

DROP TABLE IF EXISTS student;

create table student(

                  id int NOT NULL PRIMARY KEY,

                  sn int UNIQUE,

                  name VARCHAR(20),

                  qq_mail VARCHAR(20)

);

 

 对于整型类型的主键,常搭配auto_increament来使用。插入数据对应字段不给值时,使用最大值+1。

-- 主键是NOT NULL和UNIQUE的结合,可以不使用NOT NULL

id INT PRIMARY KEY auto_increament;

注:

*一个表中不允许有两个主键存在

*一个主键可以包括两个主键(复合主键)

1.6、FOREING KEY:外键约束 

表中某个列的值,必须是另一张表中的主键列或是唯一约束列的值,也就是当前表中的值必须在另一张表中存在,且满足主键或唯一约束

外键用于关联其他表的主键或唯一键,语法:

foreign key (字段名) references 主表(列)

 示例:

*创建班级表classes,id为主键

-- 创建班级表,有使用MySQL关键字作为字段时,需要使用··来标识

drop table id exists classesl;

 create table classes (

                id int PRIMARY KEY auto_increment,

                name varchar(20),

               `desc` VARCHAR(100)

);

*创建学生表,一个学生对应一个班级,一个班级对应多个学生,使用id作为主键,classes_id为外键,关联班级表id

-- 重置学生表结构

drop table if exists student;

create Table student(

                id int primary key auto_increment,

                sn int UNIQUE,name varchar(20) default '无名氏',

                qq_mail varchar(20),

                classes_id int,

                foreign key(classes_id) references classes(id)

);

2、表的设计

*需要从需求中获取类,类对应的是数据库中的实体,实体在数据库中的表现就是一张一张表,类中的属性就对应数据表中的字段

*根据实体编写SQL语句,DDL,创建具体的数据库,数据表

*设计表的时候会遵循一些范式,一般常说的有三大范式

*分类:第一范式1NF,第二范式2NF,第三范式3NF,BC范式BCNF

2.1、第一范式(一对一)

关系型数据库的最基本要求,不满足第一范式就不可以称为数据库

2.2、第二范式(一对多)

在满足第一范式的基础上,不存在非关键字段对任意候选字段的部分函数依赖(存在复合主键的情况下)

 不满足第二范式可能会出现的问题

*数据冗余: 学分和学生的姓名年龄都出现了,造成了大量的数据冗余。

*更新异常:如果要调整MySQL的学分,那么就需要更新所有的记录中关于MySQL的条目,如果一旦某些记录更新成功,某些更新失败,那么就会造成同一门课程出现不同分数的情况,数据不一致

*插入异常:每一门课都与学生都有对应的关系,只有同学选修并且通过考试获得了成绩,才可能生成一条记录,也就是一门新课程没有同学出成绩之前是无法写入数据的。

*删除异常:把毕业的同学考试成绩都删除了,删除记录的同时,课程和学分的信息也会被一块删除,导致一段时间内是没有课程和学分的数据信息。

2.3、第三范式(多对多)

 在第二范式的基础上,不存在非关键字段,对任意候选键(可以理解为主键,外键)的传递依赖

 

 满足第三范式对于插入,更新,删除来说都是比较友好的,但是查询效率明显降低

比如说,要查询同学在那个学院,首先要查出来学生记录,再通过学生记录中的学员编号,再去数据库中查询学院信息

*创建课程表

-- 创建课程表
DROP TABLE IF EXISTS course;
CREATE TABLE course (
                   id INT PRIMARY KEY auto_increment,
                   name VARCHAR(20)
);

 *创建学生课程中间表,考试成绩表

DROP TABLE IF EXISTS score;
CREATE TABLE score (
                  id INT PRIMARY KEY auto_increment,
                  score DECIMAL(3, 1),
                  student_id int,
                  course_id int,
                  FOREIGN KEY (student_id) REFERENCES student(id),
                  FOREIGN KEY (course_id) REFERENCES course(id)
);

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

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

相关文章

Shamir 秘密共享、GMW和BGW方案

一、Shamir秘密共享 Shamir秘密共享方案是一种将秘密拆分成多份并分配给多个参与者保存,只有在满足特定条件下才能恢复原始秘密的密码学方案。它具有良好的容错性、加法同态性和无条件安全性等特点。 具体地,Shamir秘密共享方案可以概括为以下步骤&…

Protobuf数据类型

enum类型 语法⽀持我们定义枚举类型并使⽤。在.proto⽂件中枚举类型的书写规范为: 枚举类型名称: 使⽤驼峰命名法,⾸字⺟⼤写。例如: MyEnum 常量值名称: 全⼤写字⺟,多个字⺟之间⽤连接。例如&#xff1a…

【嵌入式烧录/刷写文件】-2.9-Intel Hex文件的地址对齐Address Alignment

案例背景(共5页精讲): 对一个Intel Hex文件,进行地址对齐Address Alignment。 目录 1 为什么要进行“地址对齐Address Alignment” 1.1 “对齐长度”的选择 2 使用Vector HexView工具对Hex文件进行“地址对齐Address Alignment” 2.1 “自动”完成“地址对齐Ad…

【JavaEE】Cookie与Session的前后端交互-表白墙登录设计

【JavaEE】Cookie与Session的前后端交互-表白墙登录设计 文章目录 【JavaEE】Cookie与Session的前后端交互-表白墙登录设计1. Cookie与Session1.1 后端doPost的实现1.1.1 隐藏的全局变量1.1.2 获取请求对应的HttpSession对象1.1.3 约定前后端交互方式1.1.4 验证用户名与密码是否…

你不知道的Bing聊天机器人:7个惊人的用途!

导读:以下是我总结的有用的方法,可以利用AI聊天机器人让您的生活更轻松。 本文字数:1600,阅读时长大约:10分钟 生成式AI工具可以用非常多的方式使你的日常生活更轻松。 AI聊天机器人在编程、写作等方面表现出色&#…

JVM入门:官网了解JVM、Java源文件运行过程、什么是类加载器、Java的类加载机制的三种方式、Tomcat的自定义类加载器

JVM入门:官网了解JVM、Java源文件运行过程、什么是类加载器、Java的类加载机制的三种方式、Tomcat的自定义类加载器 通过官网了解JVM官网jdk8结构图什么是JVM查看官网Java语言和虚拟机规范 Java源文件运行过程1.Java源文件经过Javac编译成字节码文件如何手动编译一个…

Java如何实现去重?这是在炫技吗?

大家好,我3y啊。由于去重逻辑重构了几次,好多股东直呼看不懂,于是我今天再安排一波对代码的解析吧。austin支持两种去重的类型:N分钟相同内容达到N次去重和一天内N次相同渠道频次去重。 Java开源项目消息推送平台🔥推送…

高性能服务器为什么需要内存池?

C/C程序为什么比起其它语言开发的程序效率要高,一个很重要的原因就是可以直接操作内存,今天就来讲讲为什么需要内存池的技术。 从一个示例开始 先看下面两段代码,都是去重复的创建和删除对象0x5FFFFF次,他们的执行后的效率怎么样…

DIP第7章知识点

文章目录 7.3 相关7.5 基图像7.6 傅里叶相关变换7.6.1 离散哈特利变换7.6.3 离散正弦变换 DIP的其他章节都好复习,唯独就这个第7章小波变换。复习起来十分头大,所以我开始写他的课后题,雾。 7.3 相关 已知两个连续函数 f ( x ) f(x) f(x) …

一篇博客教会你怎么使用Docker安装Redis

文章目录 1、搜索镜像2、拉取镜像3、下载配置文件4、修改配置文件5、启动容器 今天我们学习使用 Docker 安装 Redis。 1、搜索镜像 docker search redis2、拉取镜像 docker pull redis3、下载配置文件 wget http://download.redis.io/redis-stable/redis.conf下载的配置文件…

云原生Docker容器管理

docker容器相当于一个进程,性能接近于原生,几乎没有损耗; docker容器在单台主机上支持的数量成百上千; 容器与容器之间相互隔离; 镜像是创建容器的基础,可以理解镜像为一个压缩包 docker容器的管理 容器…

彩票中奖率的真相:用 JavaScript 看透彩票背后的随机算法

原本这篇文章是打算叫「假如我是彩票系统开发者」,但细想一下,如果在文章中引用太多的 JavaScript 的话,反而不是那么纯粹,毕竟也只是我的一厢情愿,彩票开发也不全如本文所讲,有所误导的话便也是得不偿失了…

理解 Java 关键字 final

原文链接 理解 Java 关键字 final final可以用来干什么 final是Java中非常常见的一个关键字,可以说每天都在使用它,虽然常见,但却也不见得都那么显而易见,今天就来研究一下final,以加深对它的理解和更合理的运用。 修…

gitstack使用教程

一、下载及安装 下载地址:https://gitstack.com/download/?spma2c4e.10696291.0.0.6d4c19a40qOauc 支持操作系统列表 本文基于2.3.12版本 下载完成后安装,默认安装路径为:c:\GitStack,安装过程中,gitstack服务会启…

医学图像分割 nnUNetV2 分割自定义2d数据集

文章目录 1 环境安装(Pytorch)1.1 安装conda1.1 安装pytorch1.3 安装nnUNet1.4 安装隐藏层(可选) 2 配置自定义数据集2.1 数据集格式2.2 创建需要目录2.3 数据格式转换2.3.1 修改路径与数据集名称2.3.2 修改训练集与测试集2.3.3 修改掩码所在的文件夹&am…

python基础----05-----函数的多返回值、函数的多种参数使用形式、函数作为参数传递、lambda匿名函数

一 函数的多返回值 if __name__ __main__:# 演示使用多个变量,接收多个返回值def test_return ():return 1,hello,Truex,y,z test_return()print(x)print(y)print(z)1helloTrue二 函数的多种参数使用形式 分为以下四种。 2.1 位置参数 位置参数调用函数时根据…

卡尔曼滤波与组合导航原理(五)序贯Kalman滤波

量测维数很高,而且能写成很多分量,每一个分量可以看成一个小量测,可以序贯进行量测更新 优点是:计算快,数字稳定性更好,我们知道矩阵求逆是和维数的三次方成正比,分成小矩阵求逆快(都…

自学大语言模型之Bert和GPT的区别

Bert和GPT的区别 起源 2018 年,Google 首次推出 BERT(Bidirectional Encoder Representations from Transformers)。该模型是在大量文本语料库上结合无监督和监督学习进行训练的。 BERT 的目标是创建一种语言模型,可以理解句子中…

(Day1)配置云开发提供的模板

创建云开发项目 打开微信开发者工具;点击“项目”->“新建项目”;输入项目名称和选择项目所要保存的目录;输入自己的AppID; AppID的获取,需要登陆微信公众平台,并点击“开发管理”->"开发设置…

凸优化系列——凸函数

1.凸函数的定义 凸函数直观上来说,就是两点之间的函数值小于两点连线的函数值 常见凸函数 线性函数既是凸函数,也是凹函数 对于二次函数,如果Q矩阵是半正定矩阵,那么它的二阶导为Q为半正定矩阵,根据凸性判定的二阶条…