MySQL表的增删改查(进阶)-上篇

ops/2025/1/14 20:03:23/

目录

数据库约束

约束类型

NULL约束-非空约束

UNIQUE-唯一约束

DEFAULT-默认值约束

PRIMARY KEY-主键约束

FOREIGN KEY-外键约束

CHECK约束(了解)

表的设计

实体间的关系


数据库约束

数据库中的数据是如此重要,希望数据库里的数据,不要存在一些"错误的"数据。

数据库中的"约束'',对于数据库存储的数据,做出一些"限制”"要求”。
负责插入数据的程序员,确保插入的数据是靠谱的,人是不靠谱的,机器靠谱!程序靠谱!
约束,就是数据库这样的程序,对于保存的数据,进行合法性检查,这样的机制,一旦发现问题,数据库程序就能及时给出反馈。

约束类型

NOT NULL - 指示某列不能存储NULL值。
UNIQUE - 保证某列的每行必须有唯一的值。
DEFAULT - 规定没有给列赋值时的默认值。
PRIMARY KEY - NOT NULL和UNIQUE的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
FOREIGN KEY - 保证一个表中的数据匹配另一个表中的值的参照完整性。
CHECK - 保证列中的值符合指定的条件。对于MySQL数据库,对CHECK子句进行分析,但是忽略CHECK子句。MySQL并不支持,但是写了CHECK不会报错,检查条件不会生效!

NULL约束-非空约束

UNIQUE-唯一约束

unique是如何知道数据存在重复的呢?插入/修改之前,先进行查询

DEFAULT-默认值约束

最初的默认值都是NULL

PRIMARY KEY-主键约束

约定了这个表里某个列为"身份标识"(非空且唯一

不允许一个表中同时存在多个主键(多个身份标识)

主键需要分配一个唯一的值,如何进行分配呢?MySQL提供了一个自动分配主键值式,"自增主键"。插入数据时,可以不指定id列的值,让数据库自动分配,就会按照1,2,3,4…

也能手动指定其他数值

接下来插入的时候,自动分配下一条记录是5?还是101?

在MySQL中,给每个表都记录了一个"自增主键的最大值'',后续继续插入数据,无论之前的最大值是否仍然存在,都是根据之前保存的最大值继续往后分配的。

自增主键只能针对,像int/bigint整数,大部分情况下,都是用数字作为主键也是有可能会使用字符串作为主键的,可能数据量特别大的时候,不是一个MySQL数据库而是多个MySQL构成的分布式"集群'',像大公司,每天处理的数据量很大,一台机器是无法存储完成的,即使我们用的机器,配置很高,可以加很多个硬盘,此时就可以引入多个机器了,每个机器上只存储一部分数据应用程序,插入数据的时候,有一个计算规则,对数据进行区分,看这个数据是存储在哪个机器上,虽然在多个数据服务器上存储数据,仍然希望,这些数据的id这一列,仍然是唯一的,此时MySQL自增主键就难以胜任了(只能在一个机器上的MySQL生效,不能跨主机),此时,就会把id指定成字符串类型,然后通过应用程序里面的一系列算法,生成一个"唯一''的字符串id(生成的时候,有很多种不同的方式,比如uuid/雪花算法.…)

FOREIGN KEY-外键约束

涉及到两个表

没有指定约束之前

指定约束之后

往student插入的时候会触发针对class表的查询.

如果父表中的某个记录,被子表引用了,此时就不能删除/修改父表中的对应记录了
父表是约束了子表,子表也会对父表反向进行约束…

删表的时候还需要确保先删除子表再删除父表

再创建表

为什么加不了主键了

指定外键的时候,后续往子表中插入数据,就需要查询父表
主键本身也是有"唯一性要求的”,频繁触发查询,此处数据库就会对主键约束,给出特殊的处理(数据库会针对主键列创建索引),加快查询速度

如果不指定主键,是一个unique,也能达成类似的效果,都是要自动建立索引,以便于后续的快速查询

CHECK约束(了解)

MySQL使用时不报错,但忽略该约束:

drop table if exists test_user;

create table test_user (

id int,
name varchar(20),
sex varchar(1),

check (sex ='男' or sex='女')

);

表的设计

如何创建表,根据实际需求场景,梳理清楚,应该创建几个表,每个表都要有哪些列,以及多个表之间存在啥样的联系。
涉及到一些实际需求:
需要管理好同学(身份信息)和对应的成绩信息…
能够要提取出关键的内容
确定实体=>找到关键名词,提取出一些需要用到的信息…
有几个实体,一般就会有几个表,每个实体使用一个表来表示(也不绝对)
梳理实体之间的关系,根据这里关系需要对于表做出一些特殊的设定,

实体间的关系

三大范式:

(1)一对一

(2)一堆多

(3)多对多


http://www.ppmy.cn/ops/150089.html

相关文章

django在线考试系统

Django在线考试系统是一种基于Django框架开发的在线考试平台,它提供了完整的在线考试解决方案。 一、系统概述 Django在线考试系统旨在为用户提供便捷、高效的在线考试环境,满足教育机构、企业、个人等不同场景下的考试需求。通过该系统,用…

CentOS 和 Ubantu你该用哪个

文章目录 **一、CentOS 和 Ubuntu 的详细介绍****1. CentOS****1.1 基本信息****1.2 特点****1.3 缺点** **2. Ubuntu****2.1 基本信息****2.2 特点****2.3 缺点** **二、CentOS 和 Ubuntu 的异同****1. 相同点****2. 不同点****3. 使用体验对比** **三、总结和选择建议** Cent…

【Flink】flink或java异常日志输出不完整问题解决

flink或java异常日志输出不完整问题解决 1.问题 flink submit job,报错查看日志,只有Caused by: java.lang.ClassCastException,异常详情没有, 2.网上参考 参考了网上的几个解决方案,比较精准的如下: https…

【Linux】设备驱动中的ioctl详解

在Linux设备驱动开发中,ioctl(输入输出控制)是一个非常重要的接口,用于用户空间应用程序与内核空间设备驱动之间进行通信。通过ioctl,应用程序可以发送命令给设备驱动,控制设备的行为或获取设备的状态信息。…

SpringBoot + 事务钩子函数

一、案例背景 拿支付系统相关的业务来举例。在支付系统中,我们需要记录每个账户的资金流水(记录用户A因为哪个操作扣了钱,因为哪个操作加了钱),这样我们才能对每个账户的账做到心中有数,对于支付系统而言&…

正则表达式完全指南

# 正则表达式完全指南 正则表达式(Regular Expression,简称 regex 或 regexp)是一种强大的文本匹配和处理工具。它使用特定的语法规则来描述字符串的匹配模式,广泛应用于文本搜索、替换和数据验证等场景。 ## 1. 基础语法 ### 1.1…

在 Safari 浏览器中,快速将页面恢复到 100% 缩放(也就是默认尺寸)Command (⌘) + 0 (零)

在 Safari 浏览器中,没有一个专门的快捷键可以将页面恢复到默认的缩放比例。 但是,你可以使用以下两种方法快速将页面恢复到 100% 缩放(也就是默认尺寸): 方法一:使用快捷键 (最常用) Command (⌘) 0 (零…

C++实现设计模式---代理模式 (Proxy)

代理模式 (Proxy) 代理模式 是一种结构型设计模式,它为其他对象提供一个代理以控制对该对象的访问。代理模式常用于延迟加载、访问控制、智能引用等场景。 意图 提供对某对象的控制。控制对目标对象的访问,通常用于在不改变目标对象的情况下&#xff0…