「MySQL」数据库约束

🎇个人主页:Ice_Sugar_7
🎇所属专栏:数据库
🎇欢迎点赞收藏加关注哦!


数据库约束

  • 🍉约束类型
    • 🍌NOT NULL
    • 🍌UNIQUE
    • 🍌DEFAULT
    • 🍌主键
    • 🍌外键
    • 🍌CHECK

所谓约束,就是在创建表时给这个表指定一些规则,后续插入、修改、删除操作都要遵循这些规则
引入规则是为了进行更强的数据校验

🍉约束类型

🍌NOT NULL

  • NOT NULL - 指示某列不能存储 NULL 值
    在这里插入图片描述

🍌UNIQUE

  • UNIQUE - 保证某列的每行必须有唯一的值,加入 unique 约束之后,后续进行插入、修改时都会先进行查询,看当前这个值是否已经存在
    在这里插入图片描述
    如果插入重复的 id 那就会报错:
    在这里插入图片描述

🍌DEFAULT

  • DEFAULT - 规定没有给列赋值时的默认值,默认情况下默认值为NULL。进行指定列插入时,没有指定到的列就会被设为默认值
    default 放在你想给默认值的列的后面
    在这里插入图片描述

🍌主键

  • PRIMARY KEY - 主键,是数据库中最重要的约束,它相当于是 NOT NULL 和 UNIQUE 的结合。用来作为一个记录的身份标识,有助于更容易更快速地找到表中的一个特定的记录。一个表中只能有一个主键
    注意:我们通常是将 xxx id(比如 student_id、class_id 这些)设为主键

语法为:

主键 数据类型 primary key;

既然主键不允许重复,那具体该怎么保证不重复呢?MySQL提供了一种机制——自增主键。主键可以通过 auto_increment 关键字来实现自增功能

在这里插入图片描述
举个例子:
在这里插入图片描述

然后关于自增的规则有一点需要注意,自增是从当前列的最大值继续递增下去,举个例子:

在这里插入图片描述

上面这个例子,就算我们再手动插个3下去,下一次照样是从9开始递增


🍌外键

  • FOREIGN KEY - 外键,保证一个表中的数据匹配另一个表中的值的参照完整性

语法:把前面所有列都定义好之后,在最后面通过 foreign key 创建外键约束
假设现在有两个表:记录学生信息的学生表(学生在几班)、记录班级信息的班级表

create table class(classId int primary key);
create table student(name varchar(10),classId int,foreign key(classId) references class(classId));

这种情况下,我们可以认为班级表约束了学生表,我们把班级表这种约束别人的表,称为父表;把学生表这种被别人约束的表,称为子表
从语法上看,我们是在创建子表时建立外键约束,其中子表需要约束的列位于foreign key后面,父表的列位于references的后面

那么外键是如何进行约束的呢?

省流:使用外键约束时,操作子表,要先查询父表;操作父表,也要先查询子表

下面我们通过一个例子来了解一下:

mysql> insert into students values('张一',1,1);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`students`, CONSTRAINT `students_ibfk_1` FOREIGN KEY (`classid`) REFERENCES `class` (`id`))
# 报错,因为此时班级表中没有 id 为 1 的记录mysql> insert into class values(1),(2),(3);
mysql> insert into students values('张一',1,1); # 插入成功
mysql> insert into student values('张一',1);  
Query OK, 1 row affected (0.00 sec)  #插入成功
mysql> insert into students values('张三',2,4); # 报错,因为班级表中没有 4 这个记录

通过上面往子表插入记录的例子我们可以得到这样的结论:引入外键约束之后,新增一个记录,就会先在对应的父表中查询,看看是否存在,如果不存在,就会报错

外键约束其实是双向的,就是说表面上看是父表约束了子表,但与此同时,子表对父表也是有约束的,比如刚才我们在班级表中创建了3个班级,现在要删除1班,就会报错

mysql> delete from class where id = 1;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test`.`students`, CONSTRAINT `students_ibfk_1` FOREIGN KEY (`classid`) REFERENCES `class` (`id`))

尝试删除 or 修改父表中的记录时,也会先查询子表看看当前这个结果是否在子表中被引用,如果被引用,那就没法删除
要想删除父表这个记录,我们必须先删除子表中对应数据,确保子表中没有数据引用父表的记录,才能执行删除

不难看出,使用外键约束时,会伴随很多查询操作,而如果表的数据很多,那么查询就会非常低效
为了让上述查询操作更高效一些,往往需要让子表中的列和父表中被引用的列,都要带有“索引”

那这个“索引”是啥?

我们前面创建班级表的时候,将 classid 设为主键,当表里有了主键之后,就会自动创建出索引,就可以加快查询速度
注意:如果没把 classid 设为主键,那么在创建学生表使用外键约束就会报错,因为父表被引用的列得带有索引,才能被子表引用


🍌CHECK

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

不过MySQL并不支持这个操作,就是说我们可以写check,不会报错,但是check并没有真正生效(oracle之类就支持这种操作)

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

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

相关文章

layui框架实战案例(25):laydate中mark的数据后端生成

mark,自定义日期标记。该属性是对 calendar 属性的进一步延伸,灵活度更高。属性可批量设置多个日期标记,如: mark: {0-10-14: 生日, //每年每月的某一天0-0-10: 工资, // 每月 10 号2008-8-8: 开幕, // 指定的日期 }其中日期的格式…

【微服务】Spring Boot 版本升级到 2.7.18

前言 目前项目上扫描出一些 Java 依赖的代码漏洞&#xff0c;需要对现有依赖版本升级&#xff0c;记录一下遇到的问题。 <spring-boot.version>2.3.2.RELEASE</spring-boot.version> <spring-cloud.version>Hoxton.SR9</spring-cloud.version> <s…

《Python编程快速上手——让繁琐工作自动化》实践项目——Collatz序列

题目&#xff1a; 编写一个名为 collatz()的函数&#xff0c;它有一个名为 number 的参数。如果参数是偶数&#xff0c;那么 collatz()就打印出 number // 2&#xff0c;并返回该值。 如果 number 是奇数&#xff0c;collatz()就打印并返回 3 * number 1。 然后编写一个程序&a…

亚马逊服务器ssh以及scp

ssh awspass.pem为创建服务器时创建的密钥&#xff0c;ubuntu用户 ssh -i "awspass.pem" ubuntuipscp scp -i "awspass.pem" -r dist/* ubuntuip:/home/ubuntu/

菱形继承的问题以及解决方法

大家好&#xff1a; 衷心希望各位点赞。 您的问题请留在评论区&#xff0c;我会及时回答。 菱形继承概念 两个派生类继承同一个基类 又有一个类同时继承这两个派生类 这种继承被称为菱形继承&#xff0c;或者钻石继承。 基类A同时派生出类B和类C&#xff0c;派生类D又同时继…

git实战,还在苦苦挣扎,看这篇GIt实战以及安装配置案例就够了!!!

GIT实战及代码案例 GIT是一个开源的分布式版本控制系统&#xff0c;它可以帮助我们有效地管理代码版本、协作开发以及追踪代码的变更历史。在实际工作中&#xff0c;熟练掌握GIT的使用技巧能够大大提高开发效率&#xff0c;减少团队协作中的冲突。下面将详细介绍GIT的实战应用…

基于ARM 的Linux系统的交叉编译

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;在 MacOS 中安装 下一篇&#xff1a;MultiArch与Ubuntu/Debian 的交叉编译 警告 本教程可以包含过时的信息。 此步骤已在 Ubuntu Linux 12.04 上进行了测试&#xff0c;但应…

Java学习笔记——集合类学习

有一个经典的说法&#xff1a;算法数据结构 程序&#xff0c;数据结构是计算机存储、组织数据的方式。说到数据存储&#xff0c;首先会想到的应该是数组&#xff0c;不过数组存储的数据是有固定长度的&#xff0c;而且Java中&#xff0c;对数组中的数据进行增加、删除操作比较…

NOIP2011 数字反转 灰常经典的一道

[NOIP2011 普及组] 数字反转 - 洛谷https://www.luogu.com.cn/problem/P1307 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int Nsc.nextInt();int fanzhuanNumfanZhuan(N);System.out.print(fa…

LeetCode 面试题08.07.无重复字符串的排列组合

无重复字符串的排列组合。编写一种方法&#xff0c;计算某字符串的所有排列组合&#xff0c;字符串每个字符均不相同。 示例1: 输入&#xff1a;S “qwe” 输出&#xff1a;[“qwe”, “qew”, “wqe”, “weq”, “ewq”, “eqw”] 示例2: 输入&#xff1a;S “ab” 输出…

WSL使用

WSL使用 WSL安装和使用 Termianl和Ubuntu的安装 打开Hype-V虚拟化配置Microsoft Store中搜索Window Terminal并安装Microsoft Store中搜索Ubuntu, 选择安装Ubuntu 22.04.3 LTS版本打开Window Terminal选择Ubuntu标签栏, 进入命令行 中文输入法安装 查看是否安装了fcitx框架…

二分图

数据结构、算法总述&#xff1a;数据结构/算法 C/C-CSDN博客 二分图&#xff1a;节点由两个集合组成&#xff0c;且两个集合内部没有边的图。换言之&#xff0c;存在一种方案&#xff0c;将节点划分成满足以上性质的两个集合。 染色法 目的&#xff1a;验证给定的二分图是否可…

springboot3使用​自定义注解+Jackson优雅实现接口数据脱敏

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 &#x1f30a;山高路远&#xff0c;行路漫漫&#xff0c;终有归途 目录 写在前面 内容简介 实现思路 实现步骤 1.自定义脱敏注解 2.编写脱敏策略枚举类 3.编写JSON序列化实现 4.编写测…

日常刷题之77-组合

题目 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案 提示&#xff1a;假设 n5,k3 就是需要组合出来&#xff0c;长度3且内容数据是在[1,n]这个区间内的所有可能得组合 同时一个组合里面内个数字只能出现一次&#…

在linux中展示本月最后一个周五的日期

写法一 在Linux中&#xff0c;你可以使用date命令结合shell脚本来计算并展示本月最后一个周五的日期。以下是一个简单的bash脚本示例&#xff0c;用于实现这个功能&#xff1a; #!/bin/bash # 获取下个月的第一天 next_month$(date -d "next month" %Y-%m-01) …

亮数据代理IP轻松解决爬虫数据采集痛点

文章目录 一、爬虫数据采集痛点二、为什么使用代理IP可以解决&#xff1f;2.1 爬虫和代理IP的关系2.2 使用代理IP的好处 三、亮数据代理IP的优势3.1 IP种类丰富3.1.1 动态住宅代理IP3.1.2 静态住宅代理IP3.1.3 机房代理IP3.1.4 移动代理IP 3.2 高质量IP全球覆盖3.3 超级代理服务…

如何在Tomcat 9上部署前端和后端项目

在这篇指南中&#xff0c;我们将一步步介绍如何在Apache Tomcat 9服务器上部署一个前端项目&#xff08;我们的示例项目名为“dist”&#xff0c;常见于Vue.js、React等前端框架构建的产物&#xff09;和一个后端Java Web应用程序&#xff08;以WAR包形式&#xff09;。无论您是…

Java标签提高for循环运行效率,减少资源开销

一&#xff0c;Java标签提高for循环运行效率,减少资源开销 少说先看代码再讲解 List<Long> lefts new ArrayList<>(); List<Long> rights new ArrayList<>(); lefts.add(0L); lefts.add(1L); lefts.add(2L); lefts.add(3L); lefts.add(4L); lefts.…

修改Linux系统时间与网络同步

文章目录 1、安装ntpdate2、修改时区3、设置系统时间与网络时间同步4、将系统时间写入硬件时间 1、安装ntpdate # Red Hat和Cent OS系统 sudo yum install ntpdate # 乌班图 sudo apt-get install ntpdate2、修改时区 1&#xff09;运行tzselect tzselect2&#xff09;选择A…

Ubuntu篇——Ubuntu修改网卡优先级

背景&#xff1a;网线接了不能上互联网的局域网&#xff0c;WIFI连了可以上互联网的热点&#xff0c;但是发现上不了网&#xff0c;原因是网线的网卡优先级更高。 用指令临时修改网卡优先级的方法&#xff1a; 1.先看一下网卡基本信息 ip route show 显示内容如下&#xff…