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)中这个列的数据必须要在引用的另外一个表的对应列中存在,这个情况下,也可以认为,班级表约束了学生表。把这种约束其他表的表,称为父表,而把学生表这种被约束的表,成为子表。

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


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

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

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

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

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

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

 

 

 

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

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

相关文章

JMeter接口测试之文件上传

最近用JMeter做接口测试,频繁遇到了文件上传的接口,与其他一般接口的处理方式不一样,想着分享下,希望能给测试同学一点启发。 文章将围绕三个部分进行展开: 一、用户场景 二、接口请求参数 三、JMeter脚本编写步骤…

C语言每日一题(36)队列实现栈功能

力扣 225 用队列实现栈 题目描述 请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。 实现 MyStack 类: void push(int x) 将元素 x 压入栈顶。int…

vue2系列 — 自定义指令

https://v2.cn.vuejs.org/v2/guide/custom-directive.html <div v-example:foo.bar"baz">vue 自定义指令的钩子 bind&#xff1a; 当 v-XXX 指令绑定到节点上时 触发inserted&#xff1a;被绑定元素插入父节点时调用update&#xff1a;所在组件的 VNode 更新…

使用nprogress实现请求进度条

一、安装nprogress npm i nprogress 二、 在axios的请求拦截器中使用nprogress 如果对于axios的请求和响应拦截器的使用不了解的&#xff0c;可以看这篇文章&#xff1a; axios二次封装配置请求拦截器和响应拦截器-CSDN博客 nprogress上有两个有用的方法&#xff1a; star(…

OpenStack云计算平台-Dashboard(图形化)

目录 一、安装和配置 1、安全并配置组件 2、完成安装 ​二、验证操作 一、安装和配置 1、安全并配置组件 安装软件包&#xff1a; yum install openstack-dashboard 编辑文件 vim /etc/openstack-dashboard/local_settings vim /etc/httpd/conf.d/openstack-dashboard.…

如何用Python爬取全国高校数据?

前言 Python是一门强大的编程语言&#xff0c;它可以用于爬取互联网上的各种数据。在这篇文章中&#xff0c;我们将学习如何使用Python爬取全国高校数据&#xff0c;并使用代理IP进行爬取。 本文主要分为以下几个部分&#xff1a; 数据来源及需求安装依赖包及导入模块爬取全…

关于禅道的安装配置以及项目管理、团队协同工作

目录 一、禅道是什么&#xff1f; 二、特点和功能 三、安装禅道 3.1 下载官网 3.2 版本考虑 3.3 禅道使用手册参考 3.4 Windows端安装禅道 四、启动禅道 4.1 访问禅道 四、禅道部分功能的使用 4.1 添加项目集 4.2 启动/关闭项目 4.3 项目计划仪表盘/阶段目标/研发…

头歌——操作系统实训总结

死锁 1、系统出现死锁时一定同时保持了四个必要条件&#xff0c;对资源采用按序分配算法后可破坏的条件是&#xff08;A&#xff09;。 A、循环等待条件B、互斥条件C、占有并等待条件D、不可抢占条件 2、资源的静态分配算法在解决死锁问题中是用于&#xff08;B&#xff09;。 …

【图论】关键路径求法c++

代码结构如下图&#xff1a; 其中topologicalSort(float**, int, int*, bool*, int, int)用来递归求解拓扑排序&#xff0c;topologicalSort(float**, int*&, int, int, int)传参图的邻接矩阵mat与结点个数n&#xff0c;与一个引用变量数组topo&#xff0c;返回一个布尔值…

代码随想录-刷题第五天

链表题目总结 链表基本操作 对链表进行增删改查等基本操作。注意&#xff0c;很多链表的题目使用虚拟头结点操作起来会更加方便。每次对应头结点的情况都要单独处理&#xff0c;所以使用虚拟头结点的技巧&#xff0c;就可以解决这个问题。 反转链表 可以使用头插法&#xf…

Shopee本土号封号几率大吗?如何避免封号?被封号了怎么办?

Shopee是近几年热门的电商平台之一&#xff0c;即使越来越多的跨境电商涌现&#xff0c;他的地位在东南亚市场依然占据一席之地&#xff0c;也依旧吸引着需要跨境商家入局。尤其在2023年&#xff0c;在TikTok Shop在印尼被关停之后&#xff0c;留下了大片空白&#xff0c;Shope…

CF 1890A Doremy‘s Paint 3 学习笔记 map的使用

原题 A. Doremys Paint 3 time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output An array &#x1d44f;1,&#x1d44f;2,…,&#x1d44f;&#x1d45b;&#xfffd;1,&#xfffd;2,…,&#xfffd;&a…

跨境电商必须要海外代理IP吗?盘点五大海外代理IP

相信跨境电商人近日都为了2023的跨境黑五旺季奋战&#xff0c;而2024也即将来临&#xff0c;对于跨境人的考验一波接着一波&#xff0c;根据Adobe Analytics的数据&#xff0c;2022年黑色星期五的销售额创下91.2亿美元新高&#xff0c;网络星期的销售额同样达到创纪录的113亿美…

『 C++类与对象 』多态之单继承与多继承的虚函数表

文章目录 &#x1fae7; 前言&#x1fae7; 查看虚表&#x1fae7; 单继承下的虚函数表&#x1fae7; 多继承下的虚函数表 &#x1fae7; 前言 多态是一种基于继承关系的语法,既然涉及到继承,而继承的方式有多种: 单继承多继承棱形继承棱形虚拟继承 不同的继承方式其虚表的形…

ToDesk提示通道限制 - 解决方案

问题 使用ToDesk进行远程控制时&#xff0c;免费个人账号最多支持1个设备同时发起远控&#xff0c;若使用此账号同时在2个设备发起远控&#xff0c;则会提示通道限制&#xff0c;如下图&#xff1a; 解决方案 方案1&#xff1a;断开其它远控 出现通道限制弹窗时&#xff0…

数据结构(超详细讲解!!)第二十四节 二叉树(下)

1.遍历二叉树 在二叉树的一些应用中&#xff0c;常常要求在树中查找具有某种特征的结点&#xff0c;或者对树中全部结点逐一进行某种处理。这就引入了遍历二叉树的问题&#xff0c;即如何按某条搜索路径访问树中的每一个结点&#xff0c;使得每一个结点仅且仅被访问一次。 …

python3实现tailf命令

由于windows上面没有类似linux上面的tailf命令&#xff0c;所以下面的python脚本来代替其能力。 tailf.py import re import timeimport os import argparsedef follow(thefile):thefile.seek(0, os.SEEK_END)while True:_line thefile.readline()if not _line:time.sleep(0…

RabbitMQ 搭建和工作模式

MQ基本概念 1. MQ概述 MQ全称 Message Queue&#xff08;[kjuː]&#xff09;&#xff08;消息队列&#xff09;&#xff0c;是在消息的传输过程中保存消息的容器。多用于分布式系统之间进行通信。 &#xff08;队列是一种容器&#xff0c;用于存放数据的都是容器&#xff0…

docker部署微服务

目录 docker操作命令 镜像操作命令 拉取镜像 导出镜像 删除镜像 加载镜像 推送镜像 部署 pom文件加上 在每个模块根目录加上DockerFile文件 项目根目录加上docker-compose.yml文件 打包&#xff0c;clean&#xff0c;package 服务器上新建文件夹 测试docker-compo…