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

MySQL数据库约束你真的懂吗?

✏️✏️✏️今天给各位带来的是关于数据库约束方面的知识

清风的CSDN博客

😛😛😛希望我的文章能对你有所帮助,有不足的地方还请各位看官多多指教,大家一起学习交流!

动动你们发财的小手,点点关注点点赞!在此谢过啦!哈哈哈!😛😛😛

目录

 一、NULL约束

二、UNIQUE约束 

 三、DEFAULT约束

四、PRIMARY KEY约束

五、FOREIGN KEY约束 

5.1 语法

5.2 案例代码


 

 一、NULL约束

NOT NULL - 指示某列不能存储 NULL 值。

现在我们创建一个student表:

 create table student(id int, name varchar(20));

 可以看到,当我们没有进行约束的时候,id 和 name 都是可以为NULL的。

 当前这个表没有任何的约束,所以在往表里插入NULL的时候也是可以的:

insert into student values (null, null);

那么,现在来修改一下这个student,给这个表加上NOT-NULL约束:

 create table student (id int not null,name varchar(20));

那么现在就可以看到两个表的差别了,第二次创建的表,对于id这一列,是不允许为空的。

所以当我们在插入NULL的时候,有了NOT-NULL的约束,程序就不会正常运行了:

insert into student (null,null);

对于NULL约束,还是比较容易理解的。

二、UNIQUE约束 

UNIQUE - 保证某列的每行必须有唯一的值

 

现在还是创建一个student表,不加任何约束,并插入一个学号为 1 ,名字叫张三的记录:
 create table student(id int, name varchar(20));insert into student values (1,'张三');

再把张三这条记录插入进去:(程序不会报错)

 此时我们创建studenet表时加入UNIQUE约束,并插入张三的记录:

create table student (id int unique, name varchar(20));
insert into student values (1,'张三');

加入UNIQUE约束后,可以看到,id这一列的key是UNI(UNIQUE)的缩写:

因此,加入UNIQUE 约束之后,后续进行插入/修改的时候,都会先进行查询,看当前这个被约束的列的值是否已经存在。约束虽然能够引入更多的检查操作,也会增加系统的开销。

 三、DEFAULT约束

DEFAULT - 规定没有给列赋值时的默认值

进行指定列插入的时候,其他未被指定到的列就会被设成默认值。

 在这里我们还是以上面的student为例,重新创建student表并不加任何约束:

 create table student(id int, name varchar(20));

创建表的时候,我们并没有加任何默认值约束,可以看到student表中的默认值为NULL。

当我们对student表进行指定列插入:

insert into student (id) values (1);
insert into student (name) values ('张三');

这里可以看到,进行指定列插入的时候,没有被指定的列,默认就是为NULL。

此时我们给student表加上DEFAULT约束:

 create table student (id int default 0,name varchar(20) default '无名氏');

这样一来,再次进行指定列插入的时候,没有被指定的列就会被设定为创建表时候给的默认值。

四、PRIMARY KEY约束

PRIMARY KEY - NOT NULL UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标
识,有助于更容易更快速地找到表中的一个特定的记录。其实就是主键,用来作为一个记录的标识。
现在我们创建一个带有PRIMARY KEY约束的student表:
 create table student (id int primary key,name varchar(20));

需要注意一下,一张表里面只能有一个PEIMARY KEY约束。(非空&唯一)

通常创建表的时候都会指定一个主键。除了上面基础的使用之外,还有一种情况-联合主键,它也是只有一个主键,但是这个主键是由多个列联合构成的。这里不做赘述。

加入主键约束后,插入记录的时候,主键的列是不能为空的:

其次,主键的列的值也是唯一的:
insert into student values (1,'张三');
insert into student values (1,'张三);
//再次插入和第一条同样的记录
insert into student values (1,'张三);

再次插入和第一条同样的记录,程序就会报错,因为记录重复。

五、FOREIGN KEY约束 

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

5.1 语法

外键用于关联其他表的 主键 唯一键:
foreign key (字段名) references 主表(列)

5.2 案例代码

创建班级表:

 create table class (class_ID int, name varchar(20));

创建学生表:

create table student (id int, name varchar(20),class_Id int);

班级是要包含学生的,比如说班级现在有这样几个插入的数据:

insert into class values (1,'210701班'),(2,'210702班'),(3,'210703班');

现在,往学生表里面插入数据:
 insert into student values (1,'张三',1),(2,'李四',2),(3,'王五',100);

        现在,王五这个同学,不在班级表中存在,因此,这是一个不太科学的数据。而引入外键约束,就是为了解决这个问题。也就是说,希望学生表中的class_ID 都在班级表中存在,此时就可以使用外键约束。

create table class (class_ID int primary key,name varchar(20));create table student (id int primary key, name varchar(20), class_ID int, foreign key (class_ID) references class(class_ID));

       前面说到的约束,都是在定义表的时候,哪一列需要约束,就创建到哪一列的后面。而外键约束,则是写到最后。即把所有前面的列都定义好了之后,在最后通过FOREIGN KEY创建外键约束。

创建外键的时候,要指定三个信息:

  • 本表哪个列
  • 引用自哪个表(references)
  • 引用自另外一个表的哪个列

此时就要求,本表(student)中这个列的数据必须要在引用的另外一个表的对应列中存在,这个情况下,也可以认为,班级表约束了学生表。把这种约束其他表的表,称为父表,而把学生表这种被约束的表,成为子表。

引入外键之后,就会在对应的父表中检查子表插入的值是否在父表中存在,不存在就报错。其实,外键约束是双向的,父表约束子表,子表也会约束父表。比如:要想删除父表的记录,必须先删除子表对应的数据,确保子表中没有数据引用父表的记录。


✨好啦,今天的分享就到这里!之后,我会给大家分享一些复杂查询,比如联合查询,聚合查询,子查询等。

🎉希望各位看官读完文章后,能够有所提升。

✨创作不易,还希望各位大佬支持一下!

👍点赞,你的认可是我创作的动力!

⭐收藏,你的青睐是我努力的方向!

✏️评论:你的意见是我进步的财富!

 

 

 

相关文章:

MySQL数据库约束你真的懂吗?

✏️✏️✏️今天给各位带来的是关于数据库约束方面的知识 清风的CSDN博客 😛😛😛希望我的文章能对你有所帮助,有不足的地方还请各位看官多多指教,大家一起学习交流! 动动你们发财的小手,点点关…...

YOCTO 下载repo工具失败解决办法

curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o repocp repo ~/binchmod ax ~/bin/repo如果使用时报错, 切换ubuntu 到 python3 版本。gedit repo 修改repo默认链接地址:REPO_URL "https://gerrit.googlesource.com/git-repo"…...

github连接失败Host key verification failed.解决方案

问题描述 之前一直用的gitee协同协作,然后再最近一次云计算项目中团队使用的是github进行协作,但是按照常规步骤再GitHub上配置了ssh密钥后,却依然显示连接失败,无法推送和拉取代码,克隆仓库也是报错拒绝。具体报错信…...

【TIDB】TiDB认证考试PTCA 练习题 题库

目录 题目 答案 解析 题目 1.下列功能是由 TiKV 或 TiFlash 实现的为?( 选 2 项 ) A. 根据集群中 Region 的信息,发出调度指令 B. 对于 OLAP 和 OLTP 进行业务隔离 C. 将关系型数据转化为 KV 存储进行持久化 D. 将 KV 存储…...

PPP/INS紧组合算法

前言:在学习紧组合之前学会GNSS/INS松组合是很有必要的,i2NAV团队开源的KF_GINS项目可以作为GNSS/INS松组合学习模板,本文章主要对武汉大学i2NAV发布的PPP/INS紧组合学习资源进行算法层面的总结,链接: 武汉大学多源智…...

c++ 演讲比赛流程管理系统 / from.黑马

...

【shell】 1、bash语法超详细介绍

文章目录 修改前缀路径dirname set常用函数参数变量local 返回值正则打印第 n 行获取行号核对数据库各表数量jq查询检查日志 sshpassexpect数组xargs bash manual 修改前缀 参考 export PS1"bash> "路径 dirname strip last component from file name dir$(…...

华清远见嵌入式学习——网络编程——作业3

目录 作业要求&#xff1a;基于UDP的TFTP文件传输 代码 下载功能效果图​编辑 上传功能效果图 思维导图 模拟面试题和答案&#xff08;定期更新&#xff09; 作业要求&#xff1a;基于UDP的TFTP文件传输 完成文件的上传和下载功能 代码 #include<myhead.h>//实现…...

前端学习--React(3)

一、Redux 集中状态管理工具&#xff0c;不需要react即可使用&#xff0c;每个store的数据都是独立于组件之外的 vue小链接&#xff1a;vuex/pinia 基本使用 Redux将数据修改流程分成三个概念&#xff0c;state、action和reducer state - 一个对象 存放我们管理的数据状态 a…...

rotation matrix reflection matrix

文章目录 1. rotation matrix1.1 结论 2. reflection matrix2.1 结论 1. rotation matrix 图像逆时针旋转 θ \theta θ的矩阵 Q r o t a t e [ cos ⁡ θ − sin ⁡ θ sin ⁡ θ cos ⁡ θ ] (1) Q_{rotate}\begin{bmatrix}\cos\theta&-\sin\theta\\\sin\theta&\c…...

Python基础教程: sorted 函数

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 sorted 可以对所有可迭代的对象进行排序操作&#xff0c; sorted 方法返回的是一个新的 list&#xff0c;而不是在原来的基础上进行的操作。 从新排序列表。 &#x1f447; &#x1f447; &#x1f447; 更多精彩机密、教程…...

Vue 重写push和replace方法,解决:Avoided redundant navigation to current location

当我们使用编程式路由导航跳转路径时&#xff0c;如果我们两次携带同样的参数进行跳转&#xff0c;会进行页面报错&#xff1a; 那产生这个问题的原因是什么呢&#xff1f; 我们接收并输出调用push方法返回的结果&#xff1a; 会发现这是一个Promise对象 我们都知道&#xff…...

43、vue导出pdf文件,并解决滚动条外内容无法获取的问题

使用插件html2canvas和jspdf插件 下载完两个插件后引入所需要的页面 import html2canvas from "html2canvas" import jsPDF from "jspdf"1、在导出之前将元素的高度或者宽度设置为滚动高度或者宽度&#xff0c;如&#xff1a; el.style.height el.scro…...

牛客 最小公配数 golang版实现

题目请参考: HJ108 求最小公倍数 题解: 在大的数的倍数里面去找最小的能整除另外一个数的数&#xff0c;就是最小公倍数&#xff0c;按照大的来找&#xff0c;循环次数能够降到很少&#xff0c;提升效率 golang实现: package mainimport ("fmt" )func main() {a : …...

用 HLS 实现 UART

用 HLS 实现 UART 介绍 UART 是一种旧的串行通信机制&#xff0c;但仍在很多平台中使用。它在 HDL 语言中的实现并不棘手&#xff0c;可以被视为本科生的作业。在这里&#xff0c;我将通过这个例子来展示在 HLS 中实现它是多么容易和有趣。 因此&#xff0c;从概念上讲&#xf…...

华清远见嵌入式学习——网络编程——作业4

作业要求&#xff1a;①使用IO多路复用中的select函数实现TCP并发服务器客户端 ②使用IO多路复用中的poll函数实现TCP并发服务器的服务器端 一、 代码 #include <myhead.h>#define SERPORT 8888 //服务器端口号 #define SERIP "192.168.114.113"…...

【OpenCV实现图像:制作酷炫的动画效果】

文章目录 概要生成背景图添加点动画添加文本显示小结 概要 首先&#xff0c;通过导入必要的库&#xff0c;包括NumPy用于数学运算和Matplotlib库用于数据可视化。随后&#xff0c;创建图形和轴&#xff0c;初始化点的位置&#xff0c;以及编写初始化函数和更新函数。 初始化函…...

CSS鼠标属性篇

属性名&#xff1a;cursor 功能&#xff1a;设置鼠标光标的样式 属性值&#xff1a; pointer&#xff1a;小手move&#xff1a;移动图标text&#xff1a;文字选择器crosshair&#xff1a;十字架wait&#xff1a;等待help&#xff1a;帮助 eg.html{ cursor: wait;}(此处使用css改…...

交直流一体化电源系统测试步骤详解

交直流一体化电源拥有高度适应性&#xff0c;可以用于不同的电力需求领域。但是为了确保其质量和性能&#xff0c;需要对交直流一体化电源进行各项测试以保证正常工作。本文纳米软件将介绍交直流一体化电源的测试方法&#xff0c;以及如何用交直流一体化电源测试系统进行测试。…...

多数据库使用django-apscheduler时,migrate后并不能生成django_apscheduler_djangojob表的问题

先说一下django-apscheduler定时器的使用过程&#xff1a; django-apscheduler基本使用 1.安装django-apscheduler代码如下&#xff08;示例&#xff09;&#xff1a; pip install django-apscheduler 2.配置settings.py的INSTALLED_APPS代码如下&#xff08;示例&#xff09…...

告别break和default!JDK 17的Switch表达式让你的Java代码简洁又安全

JDK 17 Switch表达式&#xff1a;彻底重构Java条件逻辑的工程实践 在Java开发者的日常工作中&#xff0c;switch语句就像一把双刃剑——它本应是简化多分支逻辑的利器&#xff0c;却常常因为忘记写break而变成潜伏的Bug制造机。我至今记得团队里那个凌晨两点紧急修复的生产事故…...

终极指南:DevDocs如何通过用户画像实现个性化文档推荐

终极指南&#xff1a;DevDocs如何通过用户画像实现个性化文档推荐 【免费下载链接】devdocs API Documentation Browser 项目地址: https://gitcode.com/GitHub_Trending/de/devdocs DevDocs作为一款强大的API文档浏览器&#xff0c;不仅聚合了海量的技术文档资源&#…...

BTL框架:基于生物认知的GUI设计优化实践

1. 项目概述&#xff1a;当生物认知遇上GUI设计在图形用户界面&#xff08;GUI&#xff09;领域深耕多年后&#xff0c;我发现一个有趣现象&#xff1a;尽管硬件性能每年都在提升&#xff0c;但用户操作效率的瓶颈往往不在计算速度&#xff0c;而在于人机交互过程中的认知摩擦。…...

LVGL 启动流程全解析:RT-Thread 下的界面渲染链路

LVGL 整体启动链路&#xff08;你这个工程&#xff09; RT-Thread 自动初始化 独立 LVGL 线程 模式。 从上电到界面显示&#xff0c;完整流程如下&#xff1a; 系统启动进入 RT-Thread 主流程&#xff08;rtthread_startup&#xff09;创建并运行 main 线程&#xff08;main_t…...

【第25期】2026年4月28日 AI日报

&#x1f4c5; 2026 年 04 月 28 日 周二 &#x1f4cc; 头条速览 DeepSeek V4-Pro优惠延期&#xff0c;国产大模型价格战愈演愈烈。 &#x1f4f0; 今日动态 DeepSeek V4-Pro优惠延期至5月底&#xff0c;输入缓存价低至0.025元/百万tokens 发生了什么&#xff1a; DeepSeek官…...

Phi-mini-MoE-instruct基础教程:7.6B MoE模型本地运行全流程详解

Phi-mini-MoE-instruct基础教程&#xff1a;7.6B MoE模型本地运行全流程详解 1. 项目介绍 Phi-mini-MoE-instruct是一款轻量级混合专家&#xff08;MoE&#xff09;指令型小语言模型&#xff0c;在多个基准测试中表现出色&#xff1a; 代码能力&#xff1a;在RepoQA、HumanE…...

告别‘炼丹’低效!手把手教你用TinyViT的‘稀疏软标签’实现快速模型蒸馏

突破计算瓶颈&#xff1a;TinyViT稀疏软标签蒸馏实战指南 在模型压缩领域&#xff0c;知识蒸馏一直是个让人又爱又恨的技术。它能将大模型的知识精华提炼给小模型&#xff0c;但传统方法需要反复调用庞大的教师模型&#xff0c;这种"炼丹"过程不仅耗时耗力&#xff0…...

终极屏幕翻译神器:Translumo让你的Windows电脑瞬间打破语言壁垒

终极屏幕翻译神器&#xff1a;Translumo让你的Windows电脑瞬间打破语言壁垒 【免费下载链接】Translumo Advanced real-time screen translator for games, hardcoded subtitles in videos, static text and etc. 项目地址: https://gitcode.com/gh_mirrors/tr/Translumo …...

从零搭建K3s+WASM+Docker边缘节点:1个Shell脚本+3个YAML文件=完整CI/CD就绪环境

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Docker WASM 边缘计算部署指南 WebAssembly&#xff08;WASM&#xff09;正迅速成为边缘计算场景中轻量、安全、跨平台执行逻辑的核心载体&#xff0c;而 Docker 官方对 WASM 的原生支持&#xff08;自…...

php内核 内网离线编译私有PHP内核完整流程

一套能直接执行的&#xff1a;内网离线编译私有 PHP 内核完整流程&#xff0c;全大白话、偏生产可落地。先一句结论&#xff1a; for shortcuts最佳方式 “联…...