当前位置: 首页 > article >正文

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

目录

数据库约束

约束类型

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.kler.cn/a/502481.html

相关文章:

  • 基于“大型园区”网络设计
  • Linux 系统中两个不同的目录/proc/device-tree 和 /dev
  • 深度学习中的常见初始化方法:原理、应用与比较
  • 前端练习题
  • selenium学习笔记
  • 30_Redis哨兵模式
  • Vue.js组件开发-图片剪裁性能优化最佳方案实例
  • 【JVM-2.3】深入解析JVisualVM:Java性能监控与调优利器
  • 【解决问题】WSL报错 Netlink send error : Invalid argument
  • 认识机器学习中的经验风险最小化准则
  • torch.einsum计算张量的外积
  • 每天五分钟深度学习框架pytorch:快速搭建VGG网络的基础模块VGG块
  • docker 日常使用(进入容器、查看日志)
  • [vue] $refs和$el的使用
  • Clojure语言的正则表达式
  • 代码随想录day24 | 贪心算法理论基础 leetcode 455.分发饼干 376.摆动序列 53. 最大子序和
  • 计算机网络 (40)域名系统DNS
  • django华为产品销售的数据爬虫与可视化分析
  • CSS语言的数据类型
  • [Python学习日记-75] 计算机基础与网络
  • SpringBoot + 事务钩子函数
  • 【PPTist】公式编辑、插入音视频、添加动画
  • 【Linux笔记】Day1
  • 【微服务】面试题 5、分布式系统理论:CAP 与 BASE 详解
  • vue(五)基础语法--循环遍历指令
  • C++实现设计模式---策略模式 (Strategy)