数据库的增删改查(二)

news2024/11/29 20:55:52

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/626140.html

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

相关文章

从“制造”到“智造”!宏工科技发布“宏梦智能制造云”新产品

产业周期性变化正在给锂电产业带来深刻变革。6月7日,宏工科技在2023高工锂电材料大会上发表演讲表示,宏工科技推出了“宏梦智能制造云”,以整线一体化智造思路,赋能电池材料生产智造转型。 全球电动化与储能市场双轮驱动&#xff…

GPS跟踪系统Traccar

什么是 Traccar ? Traccar是一个开源的 GPS 跟踪系统。支持 200多种GPS 协议和 2000 多种型号的 GPS 跟踪设备。当然也包括像 iOS/Android 这样的手机设备,手机设备只需要安装Traccar的客户端即可使用。 前文介绍的 Hauk 只支持 Android 客户端&#xff…

数据分析第13课Matplotlib可视化

官网:https://matplotlib.org/users/installing.html 04-1Matplotlib介绍与安装 Matplotlib介绍 什么是Matplotlib Matplotlib是一个Python的基础绘图库,它可与 NumPy(科学计算的) 一起使用,代替Matlab(计算很好)使用。 为什么要学习Matplotlib(灵活度高) 将数据…

AutoHotKey文件与路径交互操作

文章目录 路径操作文件选择文件读写文件属性 AHK作为一种脚本语言,其功能特点是对操作系统功能的整合与简化,从而缩减操作流程,从而起到提高效率的目的。鼠标、键盘的映射,相当于是对外设操作的简化,而除了外部交互之外…

docker harbor私有仓库部署

docker harbor私有仓库部署 docker system prune -a 删除停掉的服务,自定义网络等。 docker 私有仓库 docker配置文件 vim /etc/docker.daemon.josn { “insecury-registries”: ["192.168.232.10:5000],#指定私有仓库 } docker pull/push 19…

chatgpt赋能python:Python中引入其他包的指南

Python中引入其他包的指南 Python是一种流行的编程语言,拥有丰富的开源软件包和库。许多Python程序将使用其他包来增强其功能。在本文中,我们将探讨如何在Python项目中使用和引入其他包。 什么是Python包和库? Python包是一组可重复使用的…

冈萨雷斯DIP第7章知识点

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

单链表【数据结构、数组模拟】

不采用动态链表 一般情况下,都是直接使用下面的代码进行模拟的 struct Node{int val;Node *next; }然后当我们需要进行创建一个新的节点时,都需要使用new Node(),非常慢!!! 数据规模一般都是10w~100w的数…

Android性能分析工具:Perfetto介绍及用法

本文字数:8409字 预计阅读时间:22分钟 概念 什么是Perfetto?Perfetto是Android 10中引入的全新平台级跟踪工具。这是适用于Android、Linux和Chrome的更加通用和复杂的开源跟踪项目。与Systrace不同,它提供数据源超集,可让您以pro…

【6.09 代随_52day】 最长递增子序列、最长连续递增序列、最长重复子数组

最长递增子序列、最长连续递增序列、最长重复子数组 最长递增子序列1.方法图解步骤递归代码 最长连续递增序列1.动态规划的方法图解步骤代码 最长重复子数组图解步骤代码 最长递增子序列 力扣连接:300. 最长递增子序列(中等) 1.方法 dp[i]…

开源 Golang 微服务入门三:ORM 框架 GORM

前言 前两篇笔记分别介绍了 Golang 微服务 HTTP 框架 Hertz 和 Golang 微服务 RPC 框架 Kitex,本文将要介绍面向ORM(持久层)框架 GORM。 官方文档 GORM 是面向 Golang 语言的一种 ORM(持久层)框架,支持多种数据库的接入,例如 MySQL&#x…

【TCP/IP】多进程服务器的实现(进阶) - 僵尸进程及wait、waitpid函数

目录 僵尸(Zombie)进程 僵尸进程的产生机制 僵尸进程的危害 僵尸进程的销毁 wait函数 waitpid函数 进程管理在网络编程中十分重要,如果未处理好,将会导致出现“僵尸进程”,进而影响服务器端对进程的管控。 僵尸(Zombie)进程 第一次听到…

继万物分割SAM之后,万物识别模型RAM来了!

Recognize Anything: A Strong Image Tagging Model 提出“识别万物模型”(Recognize Anything Model,RAM),用于图像打标签。RAM 可以高精度地识别任何常见类别。RAM 引入了图像打标签的一个新范式,利用大规模的图像-文…

如何在RPC和RESTful之间做选择?

不同软件系统之间的通信可以通过RPC(远程过程调用)或RESTful(表现层状态转移)协议来建立,这些协议允许多个系统在分布式计算中协同工作。 这两种协议在设计哲学上有所区别。RPC使得可以像调用本地过程一样调用服务器上…

AI时代已经到来,不想被抛弃,特别是传统产业的你,怎么办?

由于ChatGTP的惊人表现,本来已经趋于平淡的AI,又火爆起来。毫无疑问,人类已经进入了AI时代,AI将渗入到各行各业,渗入到生活与工作的每个方面。这是一场新的工业革命,很多工作都将消失,但也会产生…

【Python】Python进阶系列教程-- Python3 MySQL - mysql-connector 驱动(三)

文章目录 前言创建数据库连接创建数据库创建数据表主键设置 插入数据批量插入查询数据where 条件语句排序Limit删除记录更新表数据删除表 前言 往期回顾: Python进阶系列教程-- Python3 正则表达式(一)Python进阶系列教程-- Python3 CGI编程…

记录--7 个沙雕又带有陷阱的 JS 面试题

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 为了保证的可读性,本文采用意译而非直译。 在 JS 面试中,经常会看到一些简单而又沙雕的题目,这些题目包含一些陷阱,但这些在我们规范的编码下或者业务中…

基于BP神经网络的轨迹跟踪研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

NLP(1):Introduction

文章目录 Why process textChallengesText processingword, sentence, document, corpus, tokenProcessing stepsSentence segmentationWord TokenizationMaxMatch AlgorithmSubword Tokenization (BPE)BPE 算法 Word NormalizationStop Words Remove Wh…

数据分析第17课seaborn绘图

关系型绘图 seaborn.relplot() 这个函数功能非常强大,可以用来表示多个变量之间的关联关系。默认情况下是绘制散点图(散点图是看到变量与变量之间相关性最优的一个图形),也可以绘制线性图,具体绘制什么图形是通过kind参数来决定的。实际上以下两个函数就是relplot的特例…