【Hello mysql】 mysql的约束

news2024/11/16 15:37:32

Mysql专栏:@Mysql
本篇博客简介:介绍mysql的约束

mysql的约束

    • 表的约束
    • 空属性
    • 默认值
    • 列描述
    • zerofill
    • 主键
    • 自增长
    • 唯一键
    • 外键
    • 总结

表的约束

为什么要有约束?

我们在收集一些数据的时候会要求该数据必须存在

比如说像是国家在登记公民信息的时候身份证一栏是必须要填写的不能为空

真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合
法性,从业务逻辑角度保证数据的正确性。比如有一个字段是email,要求是唯一的

表的约束很多,这里主要介绍如下几个: null/not null,default, comment, zerofill,primary
key,auto_increment,unique key 。

空属性

数据库默认字段基本都是字段为空,但是实际开发时,尽可能保证字段不为空,因为数据为空没办法参与运算

所以说对于一些属性我们要设置为非空

语法

not null

实例

我们这里创建一个班级表 其中包含班级名和所在的教室

在外面正常的逻辑中 班级和教室都是不能为空的

  • 如果班级名为空我们就不知道自己在哪个班
  • 如果教室为空我们就不知道自己在哪个教室

所以说我们在设计数据表的时候加上非空约束

在这里插入图片描述

默认值

默认值:某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,
用户可以选择性的使用默认值。

语法

default xxx

在这里插入图片描述

我们插入一个数据尝试

在这里插入图片描述

我们这里只插入了值zhangsna但是age和sex都自动填写了

有了default之后还需要设置非空嘛?

不需要 因为如果我们没有填值的话 系统会给我们填上默认值 所以说就不存在空值的情况了

列描述

列描述:comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA来进行了解。

语法

comment ‘xxx’

此外我们可以通过查看创建语句来看到对于每个列的描述

实例

在这里插入图片描述

zerofill

刚开始学习数据库时,很多人对数字类型后面的长度很迷茫

比如说在下图中 int类型后面的11是什么意思呢?

在这里插入图片描述

整型不是4字节码?这个10又代表什么呢?其实没有zerofill这个属性,括号内的数字是毫无意义的

此时我们修改t8中age类型的属性 在后面加上zerofill

在这里插入图片描述

此时我们发现age的18前面补上了三个0

也就是说zerofill的意义其实是看该类型有没有达到指定的位数 如果没有达到就在前面加上0填充

主键

主键:primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个主键;主键所在的列通常是整数类型。

语法

primary key

实例

我们创建一张表 id作为主键 name作为非空列

在这里插入图片描述

主键约束

主键中的值不能重复 一旦重复就会报错 下面是示例

在这里插入图片描述

我们可以看到插入重复id时sql直接报错了

删除主键

语法

alter table 表名 drop primary key;

在这里插入图片描述

添加主键

语法

alter table 表名 add primary key(字段列表)

在这里插入图片描述

复合主键

在创建表的时候,在所有字段之后,使用primary key(主键字段列表)来创建主键,如果有多个字段
作为主键,可以使用复合主键

比如说在创建学生的课程表的时候学生id和课程号都是可以重复的 但是学生id和课程号的组合确是不能重复的 所以说我们要将他们设置为复合主键

语法

primary key(xxx , yyy)

在这里插入图片描述

自增长

auto_increment:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。

自增长的特点:

  • 任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)
  • 自增长字段必须是整数
  • 一张表最多只能有一个自增长

关于索引是什么概念 我们后面的博客会讲解

语法:

auto_increment

下面是实例

在这里插入图片描述

我们开始插入名字 之后查看id的变化情况

在这里插入图片描述

我们发现id数据是从1开始依次往后递增

那么如果我们现在插入一个id为1000的数据之后的id会如何变化呢?

在这里插入图片描述

我们可以发现后面的id从1001开始自增了

唯一键

在了解唯一键之前我们首先要明白一个概念

并不是因为我们选择一个属性成为了主键这个属性才具有了唯一性 而是我们选择了一个具有唯一性的属性成为了主键

也就是说除了主键之间还有很多数据也可能具有唯一性 这也就是我们唯一键出现的原因

语法

unique

下面是实例

在这里插入图片描述

当一个数据成为唯一键之后那么这个数据就不能重复了

外键

外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。

当定义外键后,要求外键列数据必须在主表的主键列存在或为null

我们先来看最后一句加粗的话 也就是说主表中必须有数据从表中才能插入数据

语法:

foreign key (class_id) references myclass(id)

下面是实例 我们先创建主表 之后再从表中创建外键约束

在这里插入图片描述

在这里插入图片描述

我们首先像从表中插入数据尝试

在这里插入图片描述

我们可以发现主表中如果没有插入数据从表中是不能插入的

在这里插入图片描述

而主表中有数据 从表中就可以插入数据了

在这里插入图片描述
而我们删除数据的时候必须要先删除从表中的数据才能删除主表

这里总结下

  • 外键是在从表中定义的
  • 从表添加数据必须主表先添加
  • 主表删除数据必须从表先删除

我们如何理解外键约束

首先这是一种约束 它肯定是为了防止我们做出错误或不符合逻辑的操作的

理论上,上面的例子,我们不创建外键约束,就正常建立学生表,以及班级表,该有的字段我们都有。

但是实际过程中由于可能会由于人为操作的失误而造成一些错误 比如说一些数据只有学生表中有 而不存在于班级表中(这样就不知道这个学生在哪个班了)

所以说我们添加外键约束是必须的 它的本质其实就是将插入和删除数据的合法性交给mysql去审核

总结

在这里插入图片描述

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

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

相关文章

实验二 常用网络命令

实验目的 了解常用网络命令及其使用方法。通过网络命令了解网络状态,并利用网络命令对网络进行简单的操作。 实验原理 1. 通过 ping 命令检测网络故障 (1)命令格式: ping [-t] [-a] [-n count] [-l size] [-f] [-i TTL] [-v T…

conic-gradient

The conic-gradient() CSS function creates an image consisting of a gradient with color transitions rotated around a center point conic-gradient方法创建了一个由围绕中心点旋转渐变组成的图片 background: conic-gradient( red 6deg, orange 6deg 18deg, yellow…

位图|布隆过滤器模拟实现|STL源码剖析系列|手撕STL

今天博主给大家带来位图和布隆过滤器的模拟实现。 前言 那么这里博主先安利一下一些干货满满的专栏啦! 手撕数据结构https://blog.csdn.net/yu_cblog/category_11490888.html?spm1001.2014.3001.5482这里包含了博主很多的数据结构学习上的总结,每一篇…

并发编程 - 利用Event Bus模式实现目录文件变化捕捉

文章目录 Pre需求CodeDirectoryTargetMonitorFileChangeEventFileChangeListener测试 Pre 并发编程 - Event Bus 设计模式 需求 JDK自1.7版本后提供了WatchService类,该类可以基于事件通知的方式监控文件或者目录的任何变化,文件的改变相当于每一个事件…

Java继承和多态

文章目录 继承继承概念继承的语法 super关键字super和this继承方式多态多态的概念多态实现条件 重写重写和重载的区别 继承 Java中使用类对现实世界中实体来进行描述,类经过实例化之后的产物对象,则可以用来表示现实中的实体,事物之间可能会…

Linux 内核级通用内存池 —— kmalloc 体系

目录 kmalloc 内存池中都有哪些尺寸的内存块 kmalloc 内存池如何选取合适尺寸的内存块 kmalloc 内存池的整体架构 KMALLOC_RECLAIM 表示需要分配可以被回收的内存,RECLAIM 类型的内存页,不能移动,但是可以直接回收,比如文件缓存页…

【Linux】第一个Linux小程序——进度条

今天为大家带来一篇关于在Linux上编写的进度条小程序的博客。 正文 我们在日常生活中使用电子产品时,经常会遇到加载的过程,这时候这些加载界面总是会附带有一些进度条,这些进度条是加载进度的可视化图形,这篇文章我们就在Linux系…

基于云原生网关的全链路灰度实践

作者: 倪海峰(海迩) 前言 随着企业规模的不断扩大,传统单体应用已很难进一步支持业务的发展,业务的迭代速度已经难以满足业务的增长,此时企业会对应用系统做微服务化的改造,降低业务的耦合度&…

keepalived脑裂

keepalived脑裂及解决方法? 一.keepalived的脑裂是如何产生的?二、HAProxy1.HAProxy概念2.HAProxy主要特性3.HAProxy负载均衡策略 4.LVS nginx HAProxy的区别5.编译部署HAProxy 一.keepalived的脑裂是如何产生的? 脑裂:指在一个高…

Elasticsearch【优化、案例】(八)-全面详解(学习总结---从入门到深化)

目录 Elasticsearch集群_测试集群状态 Elasticsearch集群_故障应对&水平扩容 Elasticsearch优化_磁盘选择 Elasticsearch优化_分片策略 Elasticsearch优化_内存设置 Elasticsearch案例_需求说明 Elasticsearch案例_ES自动补全 Elasticsearch案例_创建索引 Elastic…

多元分类预测 | Matlab 鲸鱼算法(WOA)优化xgboost的分类预测模型,多特征输入模型,WOA-xgboost分类预测

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元分类预测 | Matlab 鲸鱼算法(WOA)优化xgboost的分类预测模型,多特征输入模型,WOA-xgboost分类预测 多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就可以用。程序语言为matlab,程序可…

MySQL查询作业

一、单表查询练习 1、查询出部门编号为30的所有员工 2、所有销售员的姓名、编号和部门编号。 3、找出奖金高于工资的员工。 4、找出奖金高于工资60%的员工。 5、找出部门编号为10中所有经理,和部门编号为20中所有销售员的详细资料。 6、找出部门编号为10中…

【三】部署zabbix-proxy代理服务器和高可用,以及监控windows系统和java应用

zabbix代理服务器和高可用 1.部署zabbix代理服务器1.1 代理端zabbix-proxy配置1.2 客户端zabbix-agent配置1.3 zabbix-proxy总结 2. 部署Zabbix高可用集群2.1 主节点zabbix-server配置2.2 备节点zabbix-server配置2.3 客户端zabbix_agent配置2.4 Zabbix高可用集群总结 3.Zabbix…

JavaScript异步编程:(回调函数、Promise、async/await、Generator)

文章目录 前言1. 回调函数1.1. 回调函数的基本概念和使用方法1.2. 回调函数的优缺点和注意事项1.3. 回调地狱和如何避免 2. Promise2.1. Promise 的基本概念和使用方法2.2. Promise 的状态和状态转换2.3. Promise 的链式调用和错误处理2.4. Promise.all 和 Promise.race 的使用…

MySQL数据库中对表进行创建,插入数据并对数据进行选择

目录 1.根据此图进行建表并插入数据 2.对表进行以下操作 a:显示所有职工的基本信息 b:查询所有职工所属部门的部门号,不显示重复的部门号 c:求出所有职工的人数 d:列出最高工和最低工资 e:列出职工的平均工资和总工资 f:创建一个只有职工号、姓名和参加工作的…

123.HTML5+CSS3完结_使用Netlify收取表单

Netlify也可以做表单接受: 我们启动一下 修改下表单 ● 接着在我们的网站输入并提交表单 ● 之后会有一个提示,提示我们提交成功 然后就能在Netlify接受到用户的表单 ● 当然这个表单只能接受100个,但是作为实验也够用了 到此&a…

文字磨练课程:提高编辑和校对效率的方法

提高编辑和校对效率,可以使你更有效地完成写作任务,提升文章质量。以下是一些方法,可以帮助你在编辑和校对过程中提高效率。 1.设定目标和计划 在开始编辑和校对前,设定明确的目标和计划。这可以帮助你集中注意力,提…

【SQL应知应会】表分区(一)• MySQL版

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享,与更多的人进行学习交流 本文收录于SQL应知应会专栏,本专栏主要用于记录对于数据库的一些学习,有基础也有进阶,有MySQL也有Oracle 分区表 • MySQL版 一、分区表1.非分区表2.分区表2…

整齐有序!统一命名文件,高效管理数据轻松实现!

在数字化时代,我们每天都与大量文件打交道,文件名杂乱无章、难以辨识的情况是司空见惯的。这不仅浪费我们宝贵的时间,还可能导致信息混乱和数据丢失。但是,抛开这一切困扰吧!现在,我们向您介绍一个简单却强…

C++—string类

本期我们来学习C的string,本期内容相当的多,且有一定难度,需要大家静下心来看 目录 1.标准库中的string 1.1string类的介绍 1.2 string类的常用接口 构造函数、析构函数、赋值、拷贝构造 npos push_back append operator[ ] size …