【Hello mysql】 mysql的约束

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去审核

总结

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux | Shell】Linux 安全系统 —— 用户、组、文件权限 - 阅读笔记

目录 一、Linux 的安全性1.1 /etc/passwd 文件1.2 /etc/shadow 文件1.3 添加新用户 —— useradd1.4 删除用户 —— userdel1.5 修改用户 —— usermod、passwd、chpasswd 二、使用 Linux 组2.1 /etc/group 文件2.2 创建新组 —— groupadd2.3 修改组 —— groupmod 三、理解文…

Swagger-Bootstrap-UI

Swagger-Bootstrap-UI 是一个为 Swagger 提供美观、易用的界面展示和增强功能的开源项目。它通过自定义样式和交互,提供了更好的文档展示和交互体验,包括美化的界面、接口测试工具、在线调试、文档导出等功能。 更高阶的有Knife4j,Knife4j是一个集Swagg…

免费 Selenium各大浏览器驱动【谷歌chrme、火狐Firefox、IE浏览器】

aardio群 625494397 废话不多说 直接开整! 竟然还有脸收费 服了 下载对应版本的浏览器驱动 目标网址 应用场景 Selenium库涉及到 安装selenium库 pip install selenium-i https://mirrors.aliyun.com/pypi/simple/下载对应浏览器驱动 https://registry.npmmirror.c…

水电站运行数据3D可视化展示方便管理运维

水电站是现代能源体系中的重要组成部分,对于保障国家能源安全和经济发展具有重要的意义。然而,由于水电站的建设和管理涉及到大量的技术和专业知识,许多人对水电站的运行和维护存在许多疑惑和困惑。为了解决这些问题,我们引入了全…

TCP 重传机制 滑动窗口 流量控制 拥塞控制 学习总结!

大家好,我是三叔,很高兴这期又和大家见面了,一个奋斗在互联网的打工人。 这篇博客主要记录 tcp 的基础知识的学习总结相关内容!备注:图片均来自作者:小林哥 tcp 的三大特性 tcp 大家都不陌生&#xff0c…

Work20230705

//main.c #include "uart4.h" extern void printf(const char *fmt, ...); void delay_ms(int ms) {int i,j;for(i 0; i < ms;i)for (j 0; j < 1800; j); }int main() {while(1){//将获取到的字符1发送到终端//hal_put_char(hal_get_char()1);hal_put_string…

chatGPT之100个例子-从体验到精通

简介 本博文演示了100个chatGPT在各行各业的使用例子,全部看完有助于培养chatGPT解决问题的思维。 在人工智能时代,智能软件并不会淘汰人类,淘汰人类的是会使用人工智能的人! 我们直接使用openAI官方chatGPT,生动演示了chatGPT的一些妙用! 请仔细看完,一定会有收获! 每…

[期末网页作业]-精仿华为官网10个网页(html+css+js)

经过漫长的期末考试季节&#xff0c;我成功地完成了一个华为官网的仿写项目&#xff0c;并且非常高兴地与大家分享。这个项目包含了10个页面&#xff0c;每一个页面都经过了精心的设计和努力的填充。 首先&#xff0c;我注重了页面的整体布局与设计。借鉴了华为官网的风格&…

apache php mysql python 环境部署与离线安装deb包

文章目录 1.背景介绍2. 主要涉及操作2.1 安装系统&#xff1a;2.2 apache mysql php安装2.3 配置2.4 python相关库安装 3. 操作记录3.1 软件安装3.2 读取文件内容后进行文件内容抽取3.3 执行以上的sh脚本3.4 所学3.5 打包发送 4. 参考文献 1.背景介绍 使用的系统为ubuntu18.04…

vscode安装+配置+使用+调试【保姆级教程】

1. VScode是什么 Visual Studio Code简称VS Code&#xff0c;是一款跨平台的、免费且开源的现代轻量级代码编辑器&#xff0c;支持几乎主流开发语言的语法高亮、智能代码补全、自定义快捷键、括号匹配和颜色区分、代码片段提示、代码对比等特性&#xff0c;也拥有对git的开箱即…

架构师进阶之路 - 微服务怎么划分

目录 微服务划分目标 业务、技术、团队导向规划服务 领域检查 依赖DAG检查 分布式事务检查 性能分布检查 稳定&#xff08;易变&#xff09;性检查 调用链检查 微服务划分目标 我们常说服务的合理划分是微服务成功的重中之重&#xff0c;一个合理的服务划分应该符合一下…

Linux性能优化实践——CPU上下文

CPU上下文切换 Linux是一个多任务操作系统&#xff0c;它支持远大于CPU数量的任务同时运行。这些任务不是真正意义上的并行运行&#xff0c;而是系统在短时间内&#xff0c;将CPU轮流分配给它们&#xff0c;造成任务同时运行的错觉。 CPU需要知道任务从哪里加载&#xff0c;从…

Linux调优–I/O 调度器

Linux 的 I/O 调度器是一个以块式 I/O 访问存储卷的进程&#xff0c;有时也叫磁盘调度器。Linux I/O 调度器的工作机制是控制块设备的请求队列&#xff1a;确定队列中哪些 I/O 的优先级更高以及何时下发 I/O 到块设备&#xff0c;以此来减少磁盘寻道时间&#xff0c;从而提高系…

QC51XX---I2c使用

QCC51XX---系统学习目录_嵌入式学习_force的博客-CSDN博客 今天我们聊聊I2C的使用。在开发过程中多多少少会加入一些外围传感器可以给用户带来更好的使用体验。例如,利用接近传感器识别戴上耳机和取下耳机,从而去自动暂停播放音乐,或接听转移通话。又例如,用触摸或敲击替代…

软件安全技术复习内容

软件安全技术 边复习边写的&#xff0c;有错误及时指正第一章 软件安全概述零日漏洞安全威胁分类CIA安全基本属性PDRR模型软件安全的主要方法和技术基本方法主要技术 第二章 软件漏洞概述概念软件漏洞成因分析软件漏洞分类基于漏洞成因的分类基于漏洞利用位置的分类基于威胁类型…

基于Stable Diffusion的2D游戏关卡生成【实战】

接下来的几篇文章将与常规主题有所不同&#xff08;这是在从事通用机器人技术的职业中吸取的教训&#xff09;。 相反&#xff0c;我决定利用我的一些新空闲时间 1 边做边学&#xff0c;并使用所有酷孩子都在谈论的一些很酷的新 ML。 推荐&#xff1a;用 NSDT设计器 快速搭建可…

第五章 运输层【计算机网络】

第五章 运输层【计算机网络】 前言推荐第五章 运输层5.1运输层协议概述5.1.1 进程之间的通信5.1.2运输层的两个主要协议5.1.3运输层的端口 5.2用户数据报协议UDP5.2.1UDP概述5.2.2UDP的首部格式 5.3传输控制协议TCP概述5.3.1TCP最主要的特点5.3.2TCP的连接 5.4可靠传输的工作原…

Node中express路由基本使用

1.路由的基本使用 //引入express const expressrequire("express") //创建路由 const appexpress() //规定路由的请求方法 app.get(/,(req,res)>{res.end("hello express") }) //启动路由&#xff0c;并且端口为9000 app.listen(9000,()>{console.l…

通俗易懂讲解CPU、GPU、FPGA的特点

1. CPU vs GPU 大家可以简单的将CPU理解为学识渊博的教授&#xff0c;什么都精通&#xff1b;而GPU则是一堆小学生&#xff0c;只会简单的算数运算。可即使教授再神通广大&#xff0c;也不能一秒钟内计算出500次加减法。因此&#xff0c;对简单重复的计算来说&#xff0c;单单一…

注册HTTPS证书

注册HTTPS证书 1. 从ACME获取脚本文件2. 运行shell脚本3. 安装socat4. 把acme.sh这个脚本添加到环境变量软连接直接添加到.bashrc 5. 注册ACME账户6. 注册证书6.1. 首先把80端口打开6.2. 申请证书 7. 部署到Flask上 1. 从ACME获取脚本文件 wget https://get.acme.shmv index.ht…