MySQL数据库约束(主键约束,外键约束详解)

news2024/9/21 16:22:26
关系型数据库的一个重要功能:
需要保证数据的"完整性",可以通过人工的方式来观察确认数据的正确性,这种方式是可行的,但是不合适,因为人为控制的方式势必会存在疏忽,导致一些错误没有被检查出来,所以MySQL数据库定义了一些约束来帮助程序员更好的检查数据的正确系!

一,约束的类型

类型

说明

NOT NULL

指定某列不能存储NULL值

UNIQUE

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

DEFAULT

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

PRIMARY KEY

(主键)

NOT NULL 和 UNIQUE 的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录

FOREIGN KEY

(外键)

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

CHECK

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

二,NOT NULL

代表某个字段不能存储NULL值

在创建student表时,对name字段加入了not null约束,id字段没有加入not null约束,所以查看表结构时,id字段允许为空,而name字段不允许为空;

插入数据时,id列为NULL时插入成功,name列为NULL时,插入失败(提示name列不可以为null)

三,UNIQUE

保证某列的每行必须有唯一的值,当某一个字段插入重复的数据时会报错

在创建student表时,对id字段加入unique约束,所以在查看表结构时,id字段不允许插入重复的数据

第一次插入id为1的数据时插入成功,第二次插入id为1的数据时提示id字段有重复的数据1,插入失败

四,DEFAULT

规定没有给列赋值时的默认值,查询时未指定的列会赋上默认值

通过查看表结构之后可以看见,id和name两个字段的默认值均为null,所以未赋值时会自动赋上null值

对id和name两个字段均不赋值是,查询结果均为默认值null

五,PRIMARY KEY(主键约束)

NOT NULL 和 UNIQUE 的结合,表示某字段不能为空值,且该字段不能插入重复的数据,否则均会报错

创建表时对id字段加入primary key约束,之后对id字段插入数据必须满足既不能为空也不能重复

当id字段插入null或者插入重复数据1时,均会报错

总结:

  1. 实际开发中,大部分的表一般都会带有一个主键,主键往往是一个整数表示的id;

  1. 在mysql中,一个表里只能有一个主键,否则会报错

  1. 虽然主键不能有多个,mysql允许把多个列放在一起共同作为一个主键(联合主键);

  1. 主键另一个非常重要的用法,就是使用mysql自带的"自增主键(auto_increment)"作为主键的值;

此时对id字段创建了一个自增主键的约束,插入时直接赋值null时,mysql会自动查找到上次插入的id字段数据然后给本次的id字段赋值+1

此时id会自动增加!

六,FOREIGN KEY(外键约束)

保证一个表中的数据匹配另一个表中的值的参照完整性,针对两个表产生的约束

假设有两个表,一个是学生表(包含学生id,name,classID字段),一个是班级表(id,name字段),如果学生表中的班级ID不是班级表中ID中的数据就认为是非法数据,为了让mysql帮我们自动完成检查工作,就引入了"外键约束"!

班级表:

学生表:

此时说明student表中的classID务必要在class表的id列存在!

当往学生表的classID字段插入100时报错(外键约束插入失败)

总结:

  1. 此时这里的class表相当于父表,student表相当于子表,父表的约束相当子表,父表的数据对字表有一定约束,要求字表的数据必须在父表中存在

  1. 子表的数据也对父表的数据有一定的约束,要求删除表时要先删除子表,再删除父表

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

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

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

相关文章

git cherry-pick 教程

对于多分支的代码库,将代码从一个分支转移到另一个分支是常见需求。 这时分两种情况。一种情况是,你需要另一个分支的所有代码变动,那么就采用合并(git merge)。另一种情况是,你只需要部分代码变动&#x…

目标检测-yolov1的详细理解(代码和原理)

目标检测算法,主要分为两类: 一类是以R-CNN为代表的两阶段检测算法,将目标检测任务分为边界框回归和物体分类两个模块二是yolo系列算法,是将目标检测任务看作是回归任务。 原理 yolov1将图像划分为S*S的网格,如果检测…

计网必会:应用层结构体系

文章目录什么是应用层应用层原理P2P模式C/S模式进程的通信原理客户和服务器进程进程发生运输服务类型TCP服务UDP服务服务选择什么是应用层 应用层原理 P2P模式 两台主机相互通信互为服务器,互为主机,可以发现,这样的模式下,如果是…

【Java寒假打卡】JavaWeb-TomCat发布动态资源

【Java寒假打卡】JavaWeb-TomCat发布动态资源Servlet的介绍实现步骤Servlet的执行流程Servlet的介绍 Servlet是运行在Java服务器端的程序,用于接受和响应来自客户端基于HTTP协议的请求如果想实现Servlet的功能,可以通过实现javax.servlet.Servlet接口或…

三、QML开发之qml 语言基础

QML就是用来编辑和生成Quick界面的语言,所以在开发界面之前一定要了解基础的QML语言基础知识,接下来从介绍qml语法如何编写,变量和属性 对象的简要说明,通过本节的学习能够达到简单的加载图片 和设置lable标签存放位置&#xff0c…

【零基础】学python数据结构与算法笔记14-动态规划

文章目录前言88.动态规划介绍89.钢条切割问题90.钢条切割问题:自顶向下实现91.钢条切割问题:自底向上实现92.钢条切割问题:重构解93.最长公共子序列最长公共子序列:实现总结前言 学习python数据结构与算法,学习常用的…

CSS+JS 弹窗

弹窗 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>弹窗</title><style type"text/css">.alert {display: none;justify-content: center;align-items: center;width: 100%;height: 100vh;backgro…

输入一个url后发生了什么 js性能优化

文章目录从一道题开始&#xff1a;输入一个url后发生了什么&#xff1f;1.请求协议可聊点1&#xff1a;http协议相关> 追问: http与TCP可聊点2&#xff1a; https协议相关> 追问&#xff1a;http与https2.域名解析3.web服务器4.服务(2、3)涉及到 网络优化5.浏览器渲染6.脚…

【Zookeeper】关于windows安装问题整理汇总

文章目录常规安装&#xff1a;1、windows配置zoo.cfg之后&#xff0c;提示&#xff1a;JAVA_HOME is not set.1.1 本地没有安装JDK或者没有配置JAVA_HOME解决方案&#xff0c;参考JDK安装下载办法1.2 本地配置的JDK但是环境变量JDK路劲不叫名字“JAVA_HOME”解决方案&#xff1…

docker容器将系统盘空间占满的解决办法

最近遇到一个问题&#xff0c;线上服务器的系统盘空间被占满了&#xff0c;导致服务不能正常运行了。docker启动时会报出下面这个错误no space left on device排查用到的命令&#xff0c;显示当前路径下占用空间超过1G的文件或文件夹du -h --max-depth1|grep G|sort -n经过一番…

SAP FICO 详细解析新总账功能 - 平行分类账配置

平行分类账配置 其作用简单来说就是&#xff0c;同时一笔记账&#xff0c;会产生多个账套的凭证。 【配置流程】 1、定义总账会计核算的分类账 账套可以有多个&#xff0c;但是主分类账有且只有一个。 表FAGLFLEXT就是存储所有财务分类账发生额数据的汇总表。 勾选多个“主…

CSS知识梳理

CSS的三大特性 一 . 层叠性 : 相同选择器给设置相同的样式&#xff0c;此时一个样式就会覆盖&#xff08;层叠&#xff09;另一个冲突的样式。层叠性主要解决样式冲突的问题 层叠性原则 : 样式冲突&#xff0c;遵循的原则是就近原则&#xff0c;哪个样式离结构近&#xff0c…

在Azure应用程序按指定时区的时间来输出日志(NLog)

部署在Azure应用程序使用NLog组件进行日志输出&#xff0c;如购买的Azure云是国际版&#xff08;非中国版Azure&#xff09;&#xff0c;默认使用国标时间&#xff08;即&#xff1a;UTC&#xff09;来输出日志时间&#xff0c;与中国地区的时间相差8小时&#xff08;即&#x…

NodeJs使用mysql.createPool连接池

1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABASE mydb1; mysql> SHOW DATABASES; -------------------- | Database | -------------------- | information_schem…

客快物流大数据项目(一百零三):快递追踪需求介绍

文章目录 快递追踪需求介绍 ​​​​​​​前言 背景介绍 快递追踪需求介绍 ​​​​​​​前言

Juicesync实现对腾讯云CHDFS存储的数据迁移

文章目录前言一、Juicesync准备二、Hadoop准备三、迁移实验四、实现思路前言 近年来&#xff0c;云计算越来越流行&#xff0c;企业从自身利益出发&#xff0c;或是不愿意被单一云服务商锁定&#xff0c;或是业务和数据冗余&#xff0c;或是出于成本优化考虑&#xff0c;会尝试…

Electron + vite + vue3简单实现

文章目录一、创建Electron应用程序1. 初始化vite项目2. 安装electron3. 修改配置文件4. 编写electron文件5. npm run dev 运行二、打包1. 安装包2. 配置打包脚本3. 渲染进程和主进程的通信渲染进程主进程一、创建Electron应用程序 Electron官网 1. 初始化vite项目 npm creat…

【区块链技术前沿】可下载内容与NFT

发表时间&#xff1a;2022年3月29日 信息来源&#xff1a;coingeek.com 目前&#xff0c;DLC&#xff08;可下载内容&#xff09;仍然是备受争议的话题&#xff0c;但却是电子游戏世界在2010年代选择的一个非常成功的市场方向。许多游戏玩家继续抱怨着电子游戏发行商在敲诈用户…

认识Panda3D引擎bam相关命令

看一下Panda自带命令&#xff0c;其中有bam相关的&#xff0c;来了解一下&#xff1b; 输入一个命令看一下&#xff0c;提示需要输入一个bam文件名&#xff1b; 查一下&#xff0c;查到一个介绍一种bam文件的资料如下&#xff0c; SAM (Sequence Alignment/Map) 格式是一种通用…

Springboot +Shiro +VUE 前后端分离式权限管理系统

前言前后端分离&#xff0c;一般都是通过token实现&#xff0c;本项目也是一样&#xff1b;用户登录时&#xff0c;生成token及 token过期时间&#xff0c;token与用户是一一对应关系&#xff0c;调用接口的时候&#xff0c;把token放到header或 请求参数中&#xff0c;服务端就…