MySQL之表的约束

news2024/10/6 22:20:59

 

 

目录

一 空属性

定义

如何设置

 示例

影响:

二 默认值

定义

示例

影响:

三 列描述

定义

示例

 影响:

四 zerofill

定义:

示例:

影响:

五 主键

定义

主键的性质是什么:

为什么要有主键:

约束体现:

我们如何去设置一个主键?

复合主键

主键约束:

应用场景:

六 自增长

自增长是什么:

特点:

如何使用

 效果

七 唯一键

唯一键是什么:

特点:

 为什么要有唯一键:

和主键的关系:

如何设置

 约束体现:​编辑

八 外键

外键是什么:

为什么要有外键

要求:

理解:

测试一下外键约束


在讲之前数据类型的时候,我们已经知道数据类型其实本质上就是一种约束。但是只有这一种数据类型的约束实际上是非常单一的,因此,为了更好地保证数据的合法性,我们就引入了其他的约束。(这是非功能性的一些约束,目的是为了让数据更加合法)

这些都是对字段值的约束,也就是说我们设计列的时候会有对应的约束,约束我们插入的数据的合法性

主要从空属性,默认值,列描述,zerfill,主键,自增长,唯一键和外键来进行介绍。

一 空属性

定义

 

空属性就是对应的Null的描述,标识字段值是否可以为空。如果是Yes的话,标识该字段值可以为空。也就是我们可以不插入数据;否则,如果是No的话,就表示我们一定要插入数据,否则数据库就会报错,阻止该条数据插入,因为不符合对应的规范

注意以下三者的区分:

0:有,但是对应的是一个数字,并且这个数字的值是0

字符‘ ’:有,但是对应的是一个字符串,这个字符串是空的

Null:无 没有

 当我们新增一列的时候,如果没有指定这样的属性,默认的就是可以为空。但是在实际的开发过程中,有一些数值是绝对不能为空的,这个时候就需要我们手动去设计了。

如何设置

只要在设置属性列的时候显示地指出,这样子就不允许为空了

 示例

 这样我们两个值都必须插入才可以

影响:

对于设置了非空属性的列,那么我们在插入数据的时候,就必须不能为空;

那么数据表中存储的数据都是非空的

二 默认值

定义

default:设置了这个默认值,即使我们如果显示地指定该数据是多少,那么最终就会使我们选择的默认值。因此对于经常性出现的某一个具体的值,我们就可以在一开始设定好。

示例

我们来尝试试用一下

 

创建一个这样的表,

 

 

 

插入两条数据,我们就可以看到,对于没有设置的地方,自动被填充了对应的值

影响:

插入列的时候我们可以选择省略插入对应的数据,这样子就会去使用默认值。有这个约束的话,其实约束就降低了。设置了default可以保证数据的完整性,对于一些常用的字段,用户没有必要显示设置,但是确实数据库又需要,这个时候我们设置了default就可以省去一些重复的操作,又可以保证数据的完整性

not null和default可以同时设置吗?

这两个约束看上去是有点矛盾的,因为如果有默认值的话,这一列肯定是不为空的。这样不就和非空冲突了吗?

其实不是这样子的,设置这样的约束实际上只是为了防止插入中的一种情况:插入空值。

对于这样同时设置这一组约束我们可以这样理解:

起作用的时间来看,

对于Null,我们显示地向一列插入的时候作用的。如果插入的是正常的值就会正常显示,否则就会受到约束

对于default,在不显示的向指定列插入的时候,default才会自动起效果

从插入的情况来看

那么会不会有这样一种情况,设置了null的,我们去插入,但是插入的是null值?对于这一种情况就同时设置这两个属性来保证约束

但是实际上这样使用的很少,只是说有这样的一种情况

三 列描述

定义

设置的列描述其实在实际的数据库中相当于一个注释。我们设置了comment是给其他的数据库操作员来看的。

并且这个注释只有通过show才能查看

示例

 影响:

给其他程序员查看对应的规范

四 zerofill

定义:

这个东西需要和整型一起使用,主要是用来规定长度的,标识这个整型只有多少多少位的数字,如果不满足这个位数就用0来填充。但是数据库中实际存储的还是没有0的值,只是现实的时候这样显示

示例:

 

影响:

格式化输出。必须要配合int的位数来使用,不设置zerofill的话,单元格的长度是不一样的,但是如果设置了,表的单元格大小就是一样的,这样就可以边界对齐。

需要注意的是,

对于有符号的int,11位最大;对于无符号的是10位最大。这取决于一个整数的取值范围,无论是有符号还是无符号的,都是2^32-1 10位就可以显示出整数范围内的所有数字了。因此除了显示的所有数字还要看是否有带上符号的

五 主键

什么是主键,主键的性质是什么,为什么要有主键,我们如何去设置一个主键,主键的应用场景有哪些

定义

主键是一种约束,primary key,被设置了为主键的对应属性值具有一些特殊的性质。

主键的性质是什么:

主键非空且唯一。也就是说,被标识了主键,天然就具有这样的性质,那么我们在插入的时候,也要遵循对应的规范,否则就无法插入。

一张表中最多只有一个主键,可以没有,但是如果有主键只能有一个。并且主键通常是整数类型的一个数。

这也就体现了主键对程序员的约束,主键设置之后,对存储的数据的约束。

为什么要有主键:

方便定位,进行相关的操作。当我们表中有大量数据的时候,比较难以定位,这个时候我们就应该要有一个能确保数据唯一性的键值,方便我们去定位。

约束体现:

设置主键之后,对于查找,查找时候是通过key值进行查找的,而主键就是一种最重要的键值,可以起到区分的作用

插入的时候,我们会去比对对应的主键值,如果主键值是重复的,或者为空的,就不允许插入。

删除的时候也是同理的,我们通过key定位之后再删除。

我们如何去设置一个主键?

1 如果主键只有一个列的话(不是复合主键),可以直接跟在列后指明

经过mysqld,会被修改成这样的语句

 

自动被设置成了非空的

2 写在最后(同样适用于复合主键的)

 

 体现的约束

不能重复,不能为空

因此,这些约束我们在设计表的时候就要去想好,后期修改是比较麻烦的

复合主键

如果有多个值共同构成键值,这样就是复合主键

我们在什么时候用到?

比如,学生选课的时候,不允许一名学生把一门课选多次,这样子,需要同时去标定学生和课程对应的唯一性,就需要由复合主键来实现

 

 

主键约束:

主键的约束对两个属性同时起作用的,他们中的任何一个都是不能为空的;

另外,复合主键一起构成主键,因此只有两个键值同时冲突才不能插入数据。

在现实生活中,对应的就是(一个学生可以选其他的课,一个课也可以被其他学生选择)

应用场景:

通常需要结合业务选择一个与业务无关的唯一值

结合业务:数据的合法性,比如电话号码这些,就是唯一的。

选择与业务无关的唯一值:插入的话,上层业务修改,主键不会大改,就实现了表的结构和业务的解耦,业务不影响整体主键的表结构。

六 自增长

自增长是什么,有什么特点,如何设置,在什么情况下使用

自增长是什么:

auto_increment 如果设置了这样的约束,我们不给对应的值,也会被系统自动触发,系统中在上一个自增长的基础上+1,得到一个新的值,被设计进对应的记录中。一旦被设置了这样的约束,就是主键。

特点:

1 一般是整数

2 被设置了就是主键,因此一张表最多只能有1个

3 如果我们建好表,并且插入数据之后要去设置自增长,前提是它本身就应该key有值(索引)

关于索引:

相当于目录,可以加速我们检索速度。

本质:用空间换时间,原来相同的空间可以存储更多数据,但是用一部分的数据保存对应数据的值,这样就可以快速索引。

作用:加速对于mysql的查找

如何使用

我们必须要同时定义主键和自增

 

 效果

 确实是每一次使用需要从上一次的保存处拼接的

我们也可以断崖式地新增一个数据,这样子自增值自动跟着最大的我们新设置的更新。后续除非手动插入值,否则auto_increment的值不会再变小了

 因此:

1 不指明,连续1234……

2 指明最大的值:跟着最大值更新

七 唯一键

唯一键是什么,为什么要有唯一键,我们日常生活中怎么使用唯一键,如何设置唯一键,从业务的角度理解唯一键和主键的关系

唯一键是什么:

unique:用来标识属性唯一的约束

特点:

用来标识唯一性,可以为空

 为什么要有唯一键:

设置唯一键,是用来标识唯一性的。一个表中只能有一个属性,但是我们现实生活中的物体,往往具有很多属性,并且这些属性可能并不只有一个属性是唯一的。那么我们需要维护这些非主键属性的唯一性,就要使用唯一键来约束

数据库设置了这样的约束,就不允许在具有唯一性的地方插入相同的值,MySQL的层面保证了唯一性,防止用户误操作;

同时也保证了表的完整性和规范性:不会有相同的QQ号码……

和主键的关系:

主要从业务层面去理解

主键:快速索引,非空唯一。

唯一键:唯一可以不为空。在现实世界中不要和别的数据发生冲突,本身不参与mysql计算,不会有冲突的问题,因此可以为空。

比如我们设置学生信息表的时候,有学号,姓名,qq,邮箱等信息。设置了学号作为主键,是唯一的。但是qq号也是唯一的呀,也需要这样的维护,这时候我们就可以设置唯一键。让这个表的约束更加的规范完整。

如何设置

 约束体现:

唯一键如果设置了非空约束的话,姑且可以认为和主键的功能是一样的。(当然有差别,之后会在索引体现)

八 外键

外键是什么,为什么要有外键,如何使用外键,对于外键的理解

外键是什么:

以上的约束都主要用来定义表内部的结构,那么对于表和表之间的关系,外键就不能简单地从表内部来理解了,需要结合表和表。外键维护主表和从表的关系。被设置了外键的表就是从表,主表必须要有主键约束或者unique约束。

标识一种隶属关系。

比如多名学生隶属于一个班级,我们用两个表分别表示学生和班级,为了标识这个关系,还需要对学生表设置外键。

为什么要有外键

我们的数据库是基于需求诞生的。我们现实生活中有很多事务,这些事务有很多特征。除此之外,事务和事务之间还有很多关系。表的结构需要体现业务的关系,这些关系需要用外键来描述。这个外界的关系,体现在mysql中就是对应的外键约束

描述关系

要求:

有定义成外键约束的就是从表,依赖的另外的表就是主表,

被定义成外键的一般要具有唯一性,方便映射,因此一般是主键或者唯一键

理解:

外键要从两个方面理解:

关系+约束

比如我们定义了外键,就会对应的有这样的约束(假设有学生表和班级表,班级表中的班级号是学生表的外键)

·必须要先有班级才会有对应的学生

·要删除班级的前提是该班级没有学生

·不能把学生对应的班级修改成一个不存在的班级

……

这些约束就是由外键来维护的

这一种方案既帮我们维护了关系,又有对应的约束,这些约束就不用程序员手动去维护了。因为mysql会拦截不合法的操作。

有了外键约束,表的完整性和规范性都得到了保障。非法的数据直接从数据库层面进行拦截了

总结

外键是什么:

关系+约束

外键不仅仅是产生表之间的关联的,还有重要的属性往往被人忽略:外键在mysql中还具有特定的约束规则,来保证表和表之间的数据的完整性和一致性

测试一下外键约束

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

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

相关文章

C++——一种特殊的二叉搜索树之红黑树

目录 1 红黑树的概念2 红黑树的性质3 红黑树节点的定义4 红黑树的插入操作情况一: cur为红,p为红,g为黑,u存在且为红。情况二: cur为红,p为红,g为黑(不存在连续的红结点),u不存在/u存…

设计模式 -- 适配器模式

前言 月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂) 央是一片海洋,海乃百川,代表着一块海绵(吸纳万物) 泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出) 月央泽,学习的一种过程,从白纸->吸收各种知识->不断输入输出变成自己的内容 希望大家一起坚持这个过程,也同…

第五篇 Spring 集合注入、作用域

《Spring》篇章整体栏目 ————————————————————————————— 【第一章】spring 概念与体系结构 【第二章】spring IoC 的工作原理 【第三章】spring IOC与Bean环境搭建与应用 【第四章】spring bean定义 【第五章】Spring 集合注入、作用域 【第六章】…

时间序列分析卫星重力梯度观测值

阚昊宇 1 时间序列图 导入数据,共2880历元(86370 s)数据,取前2400历元(72000 s)数据作为训练集,后480历元作为测试集。将训练集绘制时间序列图如下图 1红色线所示,可见明显的自相关…

elementUI-el-table组件使用总结

一、背景 vue2项目中用到el-table这个组件&#xff0c;但基础的功能不够用&#xff0c;所以需要自定义 二、表头自定义 比如要让表头展现出下面的形式&#xff1a; 只需使用 slot"header" slot-scope"scope" 对插槽进行定义&#xff0c;并绑定变量 <…

快手视频艾特实操教学分享,什么是艾特脚本,评论区艾特引流脚本讲解!

大家好我是你们的小编一辞脚本&#xff0c;今天给大家分享新的知识&#xff0c;很开心可以在CSDN平台分享知识给大家,很多伙伴看不到代码我先录制一下视频 在给大家做代码&#xff0c;给大家分享一下快手艾特脚本的知识和视频演示 不懂的小伙伴可以认真看一下&#xff0c;我们…

Windows系统开启防火墙,Ubuntu与Windows互通

1.启用Windows系统防火墙&#xff0c;&#xff0c;单击"高级设置" 2.单击“入站2规则” 3.单击 “新建规则“ 4.选择“端口” 端口号设置hanwin NFS中包括的端口号。 5.选择 TCP 填写 hanewin中的端口号&#xff0c;然后单击“确认” 6.单击“入站规则” 7.右击 nf…

JAVAWeb06-动态WEB开发核心Servlet-03

1. HttpServletRequest 1.1 HttpServletRequest 介绍 HttpServletRequest 对象代表客户端的请求当客户端/浏览器通过 HTTP 协议访问服务器时&#xff0c;HTTP 请求头中的所有信息都封装在这 个对象中通过这个对象的方法&#xff0c;可以获得客户端这些信息。 1.2 HttpServle…

HTTP请求知识

一次完整的HTTP请求所经历的步骤 1&#xff1a;首先进行DNS域名解析(本地浏览器缓存&#xff0c;操作系统缓存或者DNS服务器)&#xff0c;首先会搜索浏览器自身的DNS缓存(缓存时间比较短&#xff0c;大概只有1分钟&#xff0c;且只能容纳1000条缓存) 如果浏览器自身的缓存里面…

什么是 MySQL 监控

MySQL是一个开源的关系数据库管理系统&#xff0c;它基于客户端-服务器模型运行&#xff0c;使用SQL作为其通信模式。它是世界上第二受欢迎的数据库&#xff0c;因为它具有灵活性和可扩展性、高安全性、易用性以及无缝处理大型数据集的能力。由于其广泛的功能&#xff0c;MySQL…

ThinkPHP5.1框架通过Composer下载安装

5.1版本开始&#xff0c;官网不再提供下载版本&#xff0c;请使用Composer或者git方式安装和更新。所以想安装Tp51需要通过Composer或者git方式安装 通过Composer方式安装&#xff1a; 一、 先下载Composer Wondows 平台上&#xff0c;我们只需要下载 [Composer-Setup.exe] (h…

4个Python库来美化你的Matplotlib图表

Matplotlib是一个被广泛使用的Python数据可视化库&#xff0c;相信很多人都使用过。 但是有时候总会觉得&#xff0c;Matplotlib做出来的图表不是很好看、不美观。 今天就给大家分享四个美化Matplotlib图表的Python库&#xff0c;它们可以轻松让你的Matplotlib图表变得好看&…

移远通信笔试题

限时60分钟 1.下列关于栈叙述正确的是 A A) 栈顶元素最先能被删除 B&#xff09;栈顶元素最后才能被删除 C&#xff09;栈底元素永远不能被删除 D&#xff09;以上三种都不对 在栈中&#xff0c;最后被压入的元素总是在栈顶上方&#xff0c;而栈顶元素总是最先被弹出的元…

面试题30天打卡-day09

1、一条 SQL 语句在 MySQL 中的执行过程是怎样的&#xff1f; client 根据SQL语法&#xff0c;定义好SQL语句&#xff0c;向MySQL建立连接连接器&#xff1a;client 首先要与 MySQL 建立连接&#xff0c;这就需要一个连接器&#xff0c;负责与 client 建立连接、权限验证、管理…

User accounts with SSH access to Amazon EC2 Linux instance

文章目录 一、Need to prepare ssh remote connection tool二、Enter the command and submit the pem file三、Access successful and operation performed 一、Need to prepare ssh remote connection tool For example, using XSHELL 二、Enter the command and submit t…

云通讯服务商有哪些?

随着语聊、视频通话、直播等行业的兴起&#xff0c;云通讯厂商的作用越来越凸显&#xff0c;解决画面卡顿、解决声音延迟以及基于互动领域更多的行业解决方案已经成为开发者和企业所需。 从长远来看&#xff0c;随着5G的不断普及&#xff0c;低延迟、高质量的网络环境不断催生线…

单片机课设和电子设计大赛仿真分享

兄弟们&#xff0c;我这有一堆单片机课设和电路图仿真&#xff0c;大家可以看一下 这是所有项目的一部分。 这是项目的里面的资料。 还有一堆仿真&#xff0c;这个只有仿真 下面的字是凑字数的&#xff0c;就是为了更好让大家看到这个福利 当今社会是一个电子信息技术飞速发展的…

头歌c语言实训项目-综合案例课外练习:火柴游戏

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 第1关&#xff1a;火柴游戏1 题目&#xff1a; 代码思路&#xff1a; 代码表示&#xff1a; 第2关&…

winform电影售票系统

一、前言 C#winform电影售票系统sqlserver数据库 主要技术&#xff1a; 基于C#winform架构和sql server数据库的电影售票系统 随着互联网高速发展&#xff0c;人们的娱乐生活也逐渐丰富&#xff0c;最普遍的娱乐休闲方式之一就是到电影院看电影&#xff0c;那么传统的电影订票…