「MySQL」数据库约束

news2024/12/27 11:22:57

🎇个人主页: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.coloradmin.cn/o/1543362.html

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

相关文章

HSP_03章_Pytho n 数据类型

文章目录 024 Python数据类型概述025 Python_整型int25-1各进制的整型表示方法25-2 Python_整型int 字节 026 Python_浮点型float26-1 浮点型的表现形式26-2 浮点型的大小限制边界26-3 浮点类型计算后,存在精度的损失,可以使用Decimal类进行精确计算 027 Python_布尔类型27-1 P…

Navicat Premium 16中文---数据库管理与开发的强大引擎

Navicat Premium 16是一款功能强大的数据库管理工具,旨在为用户提供高效、便捷的数据库连接、管理和保护体验。该软件支持多种数据库系统,如MySQL、Oracle、SQL Server等,满足用户多样化的需求。通过直观的图形界面,用户可以轻松进…

微信小程序实战:无痛集成腾讯地图服务

在移动互联网时代,地图服务无疑是应用程序中最常见也最实用的功能之一。无论是导航定位、附近搜索还是路线规划,地图服务都能为用户提供极大的便利。在微信小程序开发中,我们可以轻松集成腾讯地图服务,为小程序赋能增值体验。本文将详细介绍如何在微信小程序中集成使用腾讯地图…

Fomepay哪个卡段可以充值ChatGPT4

这两天Fomepay的5347与556150两个卡段真对AI订阅进行维护,所以想要充值ChatGPT4的小伙伴就要开4866卡段,这个卡段不可以开openai api key 点击获取486695卡段进行充值 开卡步骤非常简单 1、注册 2、点击申请卡 3、填写姓名,支付即可 4、开…

产品经理面试如何自我介绍?

金三银四求职季,你是不是也有面试的冲动!但面试并不是头脑一热就能取得好结果,在此之前,必须得有周全的准备,才能应对好面试官的“连环问”! 所以,今天这篇产品经理面试干货文章,别…

【linux】进程的地址空间

1.代码看现象引入 #include<stdio.h>#include<unistd.h>#include<string.h> #include<stdlib.h>int val100;int main (){ printf("i am father,pid:%d,ppid:%d,val:%d&#xff0c;&val:%p\n",getpid(),getppid(),val,&val);size_t…

Spring中@Service 、@Component、@Repository等注解区别是什么?

一、问题解析 在Spring框架中&#xff0c;有很多用来声明Spring管理的bean的常用注解。它们都是Component的特化形式&#xff0c;用于指定不同类型的组件&#xff0c;主要有以下几个&#xff1a; 1Component&#xff1a;是一个通用的组件声明注解&#xff0c;表示该类是一个Sp…

利用PSR,三步实现业务快速加载

01 什么是PSR PSR是通信业界在BSS/OSS域面向产品设计和业务开通过程中提出的一个标准化信息分层解耦和映射的框架&#xff0c;按照国际电信论坛TMF推荐的SID信息框架的标准&#xff0c;主要分为产品域、服务域和资源域等三层&#xff0c;支撑通信业务的快速加载和敏捷开通。 TM…

【LeetCode: 4. 寻找两个正序数组的中位数 + 二分查找】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

海外客户获取难?海外云手机助力电商引流!

海外电商面临的市场竞争激烈&#xff0c;如何在海外市场获客成为了摆在许多卖家面前的难题。而在这个问题的解决方案中&#xff0c;海外云手机崭露头角&#xff0c;成为助力电商引流的新利器。 在当前市场中&#xff0c;云手机主要用于游戏挂机&#xff0c;但其潜力在海外电商领…

什么是虚拟线程?

1、典型回答 Java 中的虚拟线程&#xff0c;也叫做协程或“轻量级线程”&#xff0c;它诞生于JDK 19(预览 API)&#xff0c;正式发布于 JDK 21&#xff0c;它是一种在 Java 虚拟机(JVM)层面实现的逻辑线程&#xff0c;不直接和操作系统的物理线程一一对应&#xff0c;因此它可…

Anaconda配置系统环境

首先&#xff0c;右键此电脑&#xff0c;点击属性 点击高级系统设计 点击环境变量 点击环境变量中系统环境下的Path&#xff0c;双击 如下图&#xff0c;添加这四项即可&#xff0c;注意&#xff0c;这都是Anaconda的安装目录下的内容 在windowsR的cmd情况下&#xff0c;输入co…

leetcode LCR121.寻找目标值-二维数组

目录 问题描述示例具体思路思路一思路二 代码实现 问题描述 m*n 的二维数组 plants 记录了园林景观的植物排布情况&#xff0c;具有以下特性&#xff1a; 每行中&#xff0c;每棵植物的右侧相邻植物不矮于该植物&#xff1b; 每列中&#xff0c;每棵植物的下侧相邻植物不矮于该…

刷题DAY27 | LeetCode 39-组合总和 40-组合总和II 131-分割回文串

39 组合总和&#xff08;medium&#xff09; 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates…

电脑中msvcp140_codecvt_ids.dll丢失的解决方法,实测有效的方法

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中最常见的就是缺少某个DLL文件。而msvcp140CODECVTIDS.dll就是其中之一。那么&#xff0c;msvcp140CODECVTIDS.dll是什么&#xff1f;msvcp140CODECVTIDS.dll文件属性又是什么呢&#xff1f;msvcp140C…

抖音小店怎么选品?从六点下手,才能选出爆款产品!

大家好&#xff0c;我是电商糖果 选品是做店的核心&#xff0c;它直接关系到店铺的流量和转化率&#xff0c;也就是店铺的收益。 这也是糖果在以往的文章中反复强调的&#xff0c;选品可以说非常重要了。 关于新手选品不知道从何下手&#xff0c;糖果自己总结了一下选品需要…

C++项目——集群聊天服务器项目(五)网络模块与业务模块

今天来正式书写集群聊天服务器网络模块与部分业务模块的代码 环境搭建C项目——集群聊天服务器项目(一)项目介绍、环境搭建、Boost库安装、Muduo库安装、Linux与vscode配置-CSDN博客 Json第三方库 muduo网络库 MySQL数据库 一、工程目录创建 项目通过CMake编译&#xff0c…

C语言例4-2:判断某些字符型变量中存放的是否为大写字母或数字字符。

代码如下&#xff1a; //判断某些字符型变量中存放的是否为大写字母或数字字符。 #include<stdio.h> int main(void) {int x1, x2, x3, x4; //数据定义语句char c1a, c2B, c31, c4!; //数据定义语句x1c1>A&&c1<Z; //表达式判断c1是否…

安卓studio连接手机之后,一两秒之后就自动断开了。问题解决。

太坑了&#xff0c;安卓studio链接手机之后。几秒之后就断开了。我以为是adb的问题&#xff0c;就重新安装了一下adb。并且在环境变量中配置了Path的路径。然而并没有什么用啊。 经过排查原来是数据心虚了。线的接触不良。导致你刚接通的瞬间有相对较强的电流是因为有瞬间高电压…

精酿啤酒:酿造工艺的细节与品质的关联

啤酒的酿造工艺是一个复杂而精细的过程&#xff0c;每一个环节都可能影响的品质和口感。Fendi Club啤酒作为一家注重品质和口感的品牌&#xff0c;在酿造工艺的细节方面有着严格的要求和杰出的技艺。 原料的选择是决定啤酒品质的重要因素之一。Fendi Club啤酒选用上好的大麦、水…