MySQL 增删改查进阶 — 数据库约束

news2024/12/26 21:01:33

文章目录

  • 数据库约束
    • 1.约束类型
      • 1.1 not null
      • 1.2 unique 唯一约束
      • 1.3 主键约束 primary key
      • 1.4 default 默认值
      • 1.5 外键约束 foreign key

数据库约束

约束就是让数据库帮助程序猿更好的检查数据是否正确

1.约束类型

  • not null - 提示某列不能存储 NULL 值。
    允许为空,选填项;不允许为空,必填项。
  • unique - 保证某列的每行必须有唯一的值。
    表里存的数据不能有重复的值。
  • default - 规定没有给列赋值时的默认值。
  • primary key - not null 和 unique 的结合,确保某列(或两个列多个列的结合)有唯一表示有助于更容易更快速地找到表中一个特定的记录。
    每条记录的身份标识。
  • foreign key - 保证一个表中数据匹配另一个表中的值的参照量整性。
    多个表中的关联关系,要求某个记录必须在另一个表中存在。

1.1 not null

先创建一个表

NULL 这一列描述了是否允许是空。

当加上了 not null 之后,NULL 这一列就变成不允许为 NULL。

name 这一列未被指定,所以是 YES。


可以发现往 id 这一列插入 null 记录时,就报错了。

1.2 unique 唯一约束


创建一个表


UNI 就是 unique 的简写。



再次插入 id 为1的记录是就报错了,而插入新的 id 记录时就不会报错了。

数据库是先查找这一条记录是否有相同的,若没有才会插入。

一个列可以可以同时加上多个约束。


例如加上 not null 和 unique :


PRI 就是 接下来要介绍的 primary key 的简写。

1.3 主键约束 primary key




可以根据报错信息得出被 primary key 约束的 id 列既不能是 NULL 的,也不能是重复的记录。


因为主键和 unique 都有先查询的过程,mysql 就会默认给 primary key 和 unique 这样的列自动添加索引(后面会讲),来提高查询的速度 。


注意:

  • 实际开发中大部分的表一般都会带有一个主键,主键往往是一个整数表的 id 。
  • 在 mysql 中,一个表里只能有一个主键。

  • 虽然主键不能有多个,但是mysql允许把多个列放到一起共同作为一个主键。
  • 主键另外一个常用方法是使用 mysql 自带的自增主键作为主键的值。



圈出的部分表示插入 id 的时候可以手动指定,也可以不手动指定(null),mysql 会自动生成。



这个操作不是说设成null值,而是交给数据库设成自增主键。


演示:


id 会一直按照最大值下后排列。


也可以手动指定!!!


演示:


在下一条数据插入一个101。


每次插入数据的时候,mysql 就会自动找到上一条记录的 id ,在这个基础之上,进行自增。


如果先是采用自增插入之后,再采用手动插入,之后再采用自增插入会从6开始还是会从102开始?

演示:

可以发现是接着上一条记录的 id ,是按照之前的最大值来往后累加的!!!

1.4 default 默认值




插入记录的时候如果有具体的数据,则以插入的为准。

在这里插入图片描述


如果没有,就以设置的默认值为准

1.5 外键约束 foreign key



可以查看学生是在哪个班级,看学生是否存在。
学生表和班级表两个表相互约束就称为外加约束。


没有100班级,也就是非法的数据。
可以简单理解为不是本班的学生。

为了让mysql帮助程序猿完成上述的的检查动作,就引入了外键约束!!!



此时外键约束的含义就是要求 student 表里的务必要在 class 表里的 id 列中存在的。

\


可以看到第一条记录,因为calss表中 1 是存在的,因此插入成功。
但是 101 是不存在的,因此插入失败,此时就不能随便的插入了。


学生表中的数据,要依赖班级表的数据,班级表的数据要对学生表产生约束力。
就像是父亲对孩子的约束力。

此处起到约束作用的班级表就叫做“父表”(parent);被约束的表就叫做“字表”(child)。
子表也可以反过来约束父表。


无论是添加还是修改,只要子表里的记录没在父表中存在,都会产生同样的报错信息。



如果要想删除,只能先删除子表,再删除父表。



要想创建外键,就要求父表的对应的列,得有 primary key 或者 unique 约束!!!


此时没有primary key 或者 unique 进行约束,所以就报错了。



现在考虑一个场景:电商

有一个商品表,商品表里有很多商品。
还有一个订单表,订单里有商品id这一列。

商品表:
goods(id, name , unitprice);
存在商品编号、商品名称、商品价格。

例如:

商品编号:1、商品名称:衣服 、商品价格: 100
商品编号:2、商品名称:鞋子 、商品价格: 200



订单表:
order(orderid, goodsid, time);
存在订单id、商品id、订单生成时间。

例如:

订单id: 1、商品id: 1、订单生成时间: 2022-11-10
订单id: 2、商品id: 2、订单生成时间: 2022-11-12

订单中的商品id必须要在商品表中存在。


现在这个衣服订单太多了,要将这个商品下架。
需要怎么做?

解决思路:

要想对商品下架并不是删除记录了。
而是把“是否下架”这个属性设置成是。

这种方法叫逻辑删除,并不是真正的删除。

逻辑删除引发的问题:



解决办法:

由于硬盘空间是不值钱的,因此充钱可以解锁海量的硬盘空间!!!

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

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

相关文章

wav to image concat 版

🍿*★,*:.☆欢迎您/$:*.★* 🍿 目录 背景 正文 总结 背景描述

STM32矩阵按键

矩阵按键原理 本实验使用STM32F103单片机,主题代码通用的。 如果每个按键占用一个GPIO引脚,对于使用多个按键来说就是一种资源的浪费,因此当我们在设计时,可以考虑矩阵这种方式。本实验使用4*4也就是16个按键。 矩阵按键相对于独立…

Go 语言搭建个人博客(qiucode.cn 重构篇 三)

1、读取配置文件 项目中如数据库连接、邮箱配置等这些信息一般会被写入一个文件,而通过编码在程序中读取想要的配置信息。 本项目使用yaml文件作为配置文件,配合第三方库viper来读取yaml配置文件。 go get -u github.com/spf13/viper在项目根目录新建一个yaml文件,内容如…

数学杂谈:限制条件下的均匀分布考察

数学杂谈:限制条件下的均匀分布考察 1. 问题描述2. 问题解答 1. 答案2. 解析3. 蒙特卡洛模拟 3. 离散情况延拓 1. 正整数的情况2. 整数的情况3. N→∞N \to \inftyN→∞的情况 4. 误区分析 1. 问题描述 假设x1,...,xnx_1, ..., x_nx1​,...,xn​均为0∼10 \sim 10…

思科防火墙解析(ASA)

♥️作者:小刘在C站 ♥️每天分享云计算网络运维课堂笔记,一起努力,共赴美好人生! ♥️夕阳下,是最美的,绽放。 目录 一. 防火墙的分类, 二. 发展史, 三. 思科防火墙技术应用的…

[附源码]java毕业设计铁东社区新冠病毒疫苗接种管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

山东大学线性代数-4-线性方程组

目录 4.1 齐次线性方程组 4.1.1 齐次线性方程组的定义 4.1.2 方程组的三种形式 4.1.3 齐次线性方程组解的性质 4.1.4 行最简形矩阵 4.1.5 两个例题 4.2 基础解系的求法 4.2.1 求解步骤 4.2.2 例题 4.3 非齐次线性方程组 4.3.1 相关概念 4.3.2 非齐次线性方程组的有…

编译安装php扩展

1. 切换到要安装的扩展的目录下 2. 执行phpize(在扩展目录里 可以写自己电脑里的绝对路径) ../../bin/phpize 3. 然后执行 ./configure ./configure 4. 没问题的话 make 然后 make install make 运行之后出现下图就说明可以下一步了 运行 make install make install 出现…

GitHub使用教程

目录概要一. 下载git二. 初始化本地仓库设置签名查看状态,三大分区,添加,提交操作查看状态,三大分区添加查看提交历史查看提交历史的其他指令如何进行版本切换基于索引值基于^符号进行版本切换基于~符号进行版本切换reset指令的参…

【OS】新国立nus操作系统知识点(中文版)

文章目录1. Introduction to OS本章涉及1.1 什么是操作系统?1.2 为什么我们需要操作系统?抽象 Abstraction控制程序Summary1.3 现代操作系统分类1.4 操作系统结构OS结构OS是一个程序OS的实现单片OS Monolithic OS微核OS Microkernel虚拟机 Virtual Machi…

22071.11.20作业

在串口工具进行输入: echo 1 > /dev/myled0 ---->led1灯点亮 echo 0 > /dev/myled0 ---->led1灯熄灭 echo 1 > /dev/myled1 ---->led2灯点亮 echo 0 > /dev/myled1 ---->led2灯熄灭 echo 1 > /dev/myled2 ----&g…

项目实战——创建个人中心页面(上)

ps:本篇文章不涉及复杂代码编写,放心食用~~ 目录 一、整体框架 二、创建新表 bot 三、实现后端API 1、连接数据库和后端 2、实现 增删改查 API 1、增加一个 Bot 2、删除一个 Bot 3、修改一个 Bot 4、查询 Bot 列表 一、整体框架 二、创建新表 bo…

攻防世界nice_bgm

nice_bgm 题目描述:我拿出自己的私密音乐来和你分享,一起享受快乐吧 题目环境:https://download.csdn.net/download/m0_59188912/87097729 private bit隐写,直接用python脚本跑。 脚本源码: import re import binascii…

光线追踪与全域光渲染keyshot中文

keyshot可以快速、轻松地创神奇的渲染和动画效果,支持Mac和PC上的多种3D文件格式。它可以实时查看效果,使用方便,可以更快地创造视觉效果;材料超越了材料的外观,为高质量的视觉效果提供了科学准确的性能,使…

babel:无法将“babel“项目识别问题

全局安装babel命令 npm install --global babel-cli 局部安装babel命令 npm install --save-dev babel-cli 你安装后可能会出现的问题: 可能存在原因: ① 权限不够。 ②前面需改了node的global配置 --------------------------------------------…

i.MX 6ULL 驱动开发 二十三:UART

一、UART 协议 UART详解_sternlycore的博客-CSDN博客 二、UART 和 TTY 关系 基于Linux的tty架构及UART驱动详解 - 一口Linux - 博客园 (cnblogs.com) 三、Linux UART 驱动框架中重要对象 1、UART 驱动 struct uart_driver {struct module *owner;const char *driver_na…

python自动化之——获取钉钉群所有人的昵称

python自动化之——获取钉钉群所有人的昵称 楔子 精神小伙沙大柱入职了一家新公司,该公司所有成员都在钉钉群。 一天,沙大柱的上级沙小牛布置了任务:大柱,你把群里所有人的名称导出来吧,我不会操作。 大柱表示&…

【PyCharm中PIL/Pillow的安装】

🤵‍♂️ 个人主页老虎也淘气 个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏…

操作系统 - 进程

文章目录操作系统1.操作系统的定位2.进程2.1 PCB的一些属性2.3 进程调度相关属性 :本文小结操作系统 操作系统是一个软件   用途 :管理   1.对下 :管理硬键设备 2.对上 : 为软件提供稳定的运行环境 进一步来说 : 操作系统是软件…

多重背包问题

多重背包也是 0-1 背包的一个变式。与 0-1 背包的区别在于每种物品有ki个,而非一个。 一个很朴素的想法就是:把「每种物品选ki次」等价转换为「有ki个相同的物品,每个物品选一次」。这样就转换成了一个 0-1 背包模型,套用上文所述…