【MySQL系列】表约束的学习
「前言」文章内容大致是MySQL的表的约束。
「归属专栏」MySQL
「主页链接」个人主页
「笔者」枫叶先生(fy)
目录
- 一、MySQL表的约束
- 1.1 空属性
- 1.2 默认值(default)
- 1.3 列描述(comment)
- 1.4 zerofill
- 1.5 主键(primary key)
- 1.6 自增长(auto_increment)
- 1.7 唯一键(unique)
- 1.8 外键(foreign key)
一、MySQL表的约束
- 数据类型也可以进行约束插入的值,如果插入的数据超出了对应数据类型的取值范围,那么数据将会插入失败。
- 但是数据类型的约束很单一,为了更好的保证数据的合法性,从业务逻辑角度保证数据的正确性,MySQL中出现了表的约束。
- 目的就是为了尽可能保证数据合法性,数据是符合预期的。表的约束是通过技术手段,倒逼插入数据的人,插入的数据是合法的,还有一个就是减少用户的误操作可能性。
- 反过来,站在MySQL的视角,对于成功插入数据库的数据一定是合法的。
- 约束的目的:保证数据的完整性和可预期性
- 表的约束很多,这里主要介绍如下几个:
null/not null,default, comment, zerofill,primary key,auto_increment,unique key
注意:MySQL的命令对大小写不敏感的,即不区分大小写。
1.1 空属性
- 空属性有两个值,分别是
null
(空)和not null
(不为空) - 数据库默认字段基本都是字段为空,但是实际开发时,尽可能保证字段不为空,因为数据为空没办 法参与运算
空值是无法参与运算,例如:
注意:null代表的是不存在,不是C语言、C++里面的NULL,注意区别。
例如:创建一个班级表,包含班级名和班级所在的教室
mysql> create table if not exists class(-> class_name varchar(20),-> class_room varchar(10));
查看表的属性,这些类型字段默认是null
尝试插入数据,是允许插入为空的数据的
站在正常的业务逻辑中:
- 如果班级没有名字,你不知道你在哪个班级
- 如果教室名字可以为空,就不知道在哪上课
所以我们在设计数据库表的时候,一定要在表中进行限制,不满足条件的数据就不能插入到表中。这就是“约束”。
如果要让某个字段不允许为空,在创建表的时候就可以给对应字段设置
not null
属性。
依旧是创建一个班级表,包含班级名和班级所在的教室,但是这两个属性不允许为空
mysql> create table if not exists class2(-> class_name varchar(20) not null,-> class_room varchar(10) not null);
创建表完毕后查看表结构,可以看到这两个字段是不允许为空的。
查看表创建时的细节
向表中插入数据时,只有这两个字段都不为空时才能插入成功,否则将会插入失败。
1.2 默认值(default)
- 如果某一个字段会经常性的出现某个值,那么就可以考虑将这个值设置成该字段的默认值。
- 向表中插入数据时如果不给带有默认值的字段赋值,那么就会使用默认值进行插入。
比如,创建一个表,表当中包含用户的姓名、年龄和性别,年龄和性别分别设置为18,男
mysql> create table if not exists t1(-> name varchar(20) not null,-> age tinyint unsigned default 18,-> sex char(2) default '男');
创建之后,查看表是属性
向表中插入数据时,如果不指明用户的年龄或性别,那么就会使用对应的默认值(缺省值)
还有一种就是一个字段同时设置not null
和default
两个值:
- 一旦给某一字段设置了默认值,那么该字段将不会出现空值,因为就算插入数据时没有指明该字段的值,也会使用该字段的默认值进行填充。
- 而给某一字段设置not null属性的目的是约束该字段不能为空,因此一个字段设置了
default
属性后,再设置not null
属性就没有意义了。
1.3 列描述(comment)
列描述comment
,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA来进行了解,相当于C语言、C++的注释。
比如创建一个表,表当中包含用户名、用户的年龄和用户的性别,在每一个字段后面添加上对应的列描述。
mysql> create table if not exists t2(-> name varchar(20) not null comment '这是用户的名字',-> age tinyint unsigned default 18 comment '这是用户的年龄',-> sex char(1) default '男' comment '这是用户的性别');
创建之后,查看表创建时的详细信息(通过desc查看不到注释信息)
show create table t2;
注意:MySQL使用单引号也可以代表字符串,与C语言、C++的有区别
1.4 zerofill
数值类型后面的圆括号中的数字,代表的是显示宽度,对应数值类型设置zerofill属性后,如果数据的宽度小于设定的宽度则自动填充0
例如:创建一个表,表当中包含a和b两列整型数据,将它们的显示宽度都设置成5,但是没有设置zerofill属性
mysql> create table if not exists t3(-> a int(5),-> b int(5));
向表中插入一条记录,正常显示
修改表结构,给a列添加上zerofill属性,由于a列数据的显示宽度为5,因此查看表中数据可以看到a列数据中宽度不足5位的数据都自动在前面填充0
要注意的是,这只是最后显示的结果,在MySQL中实际存储的还是1,00001
只是设置了zerofill
属性后的一种格式化输出而已。
简单说一下索引,后序详谈
- 索引:在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。
- 索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。
- 索引提供指向存储在表的指定列中的数据值的指针,然后根据指定的排序顺序对这些指针排序。
- 数据库使用索引以找到特定值,然后顺指针找到包含该值的行。这样可以使对应于表的SQL语句执行得更快,可快速访问数据库表中的特定信息。
1.5 主键(primary key)
主键primary key
用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个主键;主键所在的列通常是整数类型
比如创建一个学生表,表当中包含学生的学号和姓名,由于学生的学号是不会重复的,因此可以将其设置成主键
mysql> create table if not exists student(-> stu_id int unsigned primary key comment '学生ID',-> stu_name varchar(20) not null comment '学生姓名');
创建表成功后查看表结构,可以看到id对应的Key列出现了PRI,PRI就是主键。
查看表的创建详细信息,主键也可以这样设置,图中圈起来的
进行插入,插入表中的记录的主键字段不能重复,如果插入记录的主键与表中已有记录的主键重复,这时就会因为主键冲突而插入失败
当表创建好以后但是没有主键的时候,可以再次追加主键
alter table 表名 add primary key(字段列表)
需要注意:只有列当中的值不为空并且不重复的列才能被设置成主键,如果列中已经有了重复的的值,则设置主键失败。这也说明要先把表结构设计好,不然后面插入有数据很难进行操作
删除主键
alter table 表名 drop primary key;
复合主键
- 一张表里面只能有一个主键,但一个主键可以由多个字段来承担,这种主键叫做复合主键。
- 复合主键用来唯一约束多个字段里面的数据,表当中每条记录的这多个字段不能同时重复也不能为空。
比如创建一个成绩表,表当中包含学生的ID,课程ID,成绩。学生ID和课程ID可以同时设置为主键,因为这两个字段不能同时重复也不能为空。
mysql> create table if not exists t5(-> stu_id int unsigned,-> course char(10) comment '课程ID',-> score tinyint unsigned default 0 comment '成绩',-> primary key(stu_id, course) -- id和course为复合主键-> );
注:-- 后面也是注释
查看表信息,可以看到两列都是PRI,即主键,并且它们都是不允许为空的
向表中插入数据时,只有插入的学生ID和课程ID同时出现冲突时才会产生主键冲突,否则就允许插入。
只有两个同时冲突时才会产生主键冲突,有点像C语言的&&
条件
1.6 自增长(auto_increment)
自增长auto_increment
,当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键
自增长的特点:
- 任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)
- 自增长字段必须是整数
- 一张表最多只能有一个自增长
比如创建一个表,表当中包含id和name,将id同时设置成主键和自增长字段
mysql> create table if not exists t6(-> id int unsigned auto_increment,-> name varchar(20) not null default '',-> primary key(id)-> );
创建表完毕后查看表结构,可以看到id的Extra
列中出现了auto_increment
标志
向表中插入第一条记录时如果没有指明自增长字段的值,那么自增长字段的值默认将会从1开始。id不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值
后续向表中插入记录时如果也不指明自增长字段的值,那么自增长字段的值就会依次递增。如下:
插入数据的时候也可以指明自增长字段的值,此时将会使用该值进行插入,但注意指明的值不能和表中已有的id值重复。
继续插入,会i从d列中找出最大值,会将最大值加一后得到的值作为自增长字段的值进行插入
这个自增长在表外就有设置,查看表创建的详细信息就可以看到,这个值就是作为下一次自增长的值。如果想指定自增长的开始值,可以在表外面进行修改这个值。
输入select last_insert_id();
可以查看当前值的上一个,即表中的最大一个值
1.7 唯一键(unique)
- 一张表中往往有很多字段需要唯一性,但一张表中只能有一个主键,而唯一键就可以解决表中有多个字段需要唯一性约束的问题。
- 唯一键和主键都能保证字段中数据的唯一性,但唯一键允许字段为空,并且可以多个字段为空,空字段不做唯一性比较。
- 需要注意的是,某一字段被选择成为了主键,仅仅是因为这个字段被选择成为主键,除了主键之外,仍有其他需要标识唯一性的字段,这些字段就可以被设置成唯一键。
- 主键和唯一键是互相补充的关系
比如,创建一个学生表,表当中包含学生的id、姓名和电话号码,将我们选择id作为主键,但同时每个学生的电话号码也应该具有唯一性约束,因此应该将电话号码设置成唯一键。
mysql> create table if not exists t7(-> stu_id int unsigned primary key auto_increment,-> name varchar(20) not null,-> tel varchar(20) unique comment '唯一键'-> );
表创建完毕后查看表结构,可以看到tel的Key列出现了UNI
标志,这就表明tel已经成功被设置成唯一键了。
查看表创建的详细信息
向表中插入数据时,如果插入记录中的电话号码与表中已有记录的电话号码出现重复,那么就会因为唯一键冲突而插入失败,还有唯一键是可以允许为空。
1.8 外键(foreign key)
- 外键用来定义主表和从表之间的关系,外键约束主要定义在从表上,主表必须有主键约束或唯一键约束。
- 外键定义后,要求插入外键列的数据必须在主表对应的列存在或为null。
- 外键是用于表和表之间的关联,表和表之间的约束。
语法:
foreign key (字段名) references 主表(列)
比如,先创建一个班级表作为主表,表当中包含班级的id和班级名,并将班级id设置为主键。
mysql> create table if not exists class(-> id varchar(10) primary key,-> name varchar(20) not null-> );
创建成功后查看表的详细信息
再创建一个学生表,表当中包含学生的id、姓名以及学生所在班级对应的id,学生ID设置为主键,班级ID设置为外键
mysql> create table if not exists student(-> stu_id int unsigned primary key auto_increment,-> name varchar(20) not null,-> class_id varchar(20),-> foreign key(class_id) references class(id)-> );
表创建成功后查看表的详细信息,学生表中的班级id对应的Key列出现了MUL
,这表明class_id已经成功被设置成了外键。
向班级表插入两条数据
向学生表中插入记录时,如果插入的记录对应的班级id是班级表中存在的,或者插入的班级id为null,那么此时是允许进行插入的。
但是如果插入学生表的记录对应的班级id是不存在,此时将会插入失败,这就是外键约束
这里的班级表就是主表,学生表就是从表
在查看学生表创建时的详细信息时,图中圈起来的,这个字段是给外键约束起名字,不过一般都不怎么使用,默认情况下外键有自己的名字,圈起来引号的内容。
--------------------- END ----------------------
「 作者 」 枫叶先生
「 更新 」 2023.8.6
「 声明 」 余之才疏学浅,故所撰文疏漏难免,或有谬误或不准确之处,敬请读者批评指正。
相关文章:
【MySQL系列】表约束的学习
「前言」文章内容大致是MySQL的表的约束。 「归属专栏」MySQL 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 一、MySQL表的约束1.1 空属性1.2 默认值(default)1.3 列描述(comment)1.4 zerofill1.5 主键(primary ke…...
低功耗LoRaWAN国产低功耗LoRa+RF射频前端芯片XD6500S
目录 典型应用XD6500S简介芯片特性 LoRa系列选型参考 LoRa是为低数据速率、远距离距离和超低功耗而优化的扩频协议,用于LPWAN应用程序的通信。 典型应用 一、智慧农业 智慧农业大田解决方案利用传感设备、自动化控制设备、气象站实时监测采集田间土壤墒情、气象…...
【基础IO】文件系统 {磁盘的物理结构,存储结构,逻辑结构;CHS 和 LBA 寻址方式;磁盘分区和块组;文件inode;软硬链接}
文件系统 文件分为: 内存文件:被进程打开的文件,文件被加载到内存中供进程快速读写。磁盘文件:没有被打开的文件,保存在磁盘上。磁盘文件被分门别类的存储和管理,用于支持更好的存取。 提示: …...
全角字符和半角字符
全角字符的由来 全角符号是双字节中文编码的历史遗留问题。当年在纯文本的界面中,为了让西文和中日韩的方块字对齐,就让西文字母、数字和标点也占用一个汉字的视觉空间,并使用 2 个字节存储。后来,其中的一些全角字符因为比较有用…...
【java】【经验】java: 错误: 不支持发行版本 6
前言:配置过maven之后,发现原来的一些项目运行提示java: 错误: 不支持发行版本 6或者java: 错误: 不支持发行版本 5,主要原因:是因为项目使用的Java版本和安装的Java版本不符合 目录 1 设置项目java版本 2 设置模块版本 3 set…...
Spring Boot3.0(四):Thymeleaf 使用详解
Thymeleaf 介绍 简单说,Thymeleaf 是一个跟 Velocity、FreeMarker 类似的模板引擎,它可以完全替代 JSP 。相较与其他的模板引擎,它有如下三个极吸引人的特点: 1.Thymeleaf 在有网络和无网络的环境下皆可运行,即它可以…...
杨辉三角【Java二维数组】
这个代码中,我们定义了一个二维数组nums来存储杨辉三角的每一个数字。在for循环中,我们初始化每一行的第一个和最后一个数字,并且根据上一行的数字来计算出中间的数字。 接着,我们使用两个嵌套的for循环来输出杨辉三角。第一个循…...
解决SpringBoot服务返回数据存在$ref $.data等相关问题
1、场景 在日常的开发中,我们数据接口返回数据使用了FastJson序列化数据,当返回一个数据list时候出现" r e f " " ref" " ref"".data" 等类似乱码一样的数据,当时我比较匪夷所思,我写…...
【iOS安全】开启任意app的WebView远程调试
参考:https://mp.weixin.qq.com/s/bNKxQaVrPaXsZ5BPbsXy7w (来自周智老师的公众号) 概述 Safari 有一个内置的前端调试器, 在iPhone通过局域网或者USB连接MacBook 并启用Safari 远程调试之后,前端调试器默认情况下对…...
windows下 java程序无窗口启动、无窗口启动java -jar
创建一个.bat文件,其他照抄,注意一下你自己的jar包路径和日志路径:例:java -jar C:\data\operation-1.0-SNAPSHOT.jar > C:\data\log.log 2>&1 & ------------文件内容 echo off %1 mshta vbscript:CreateObject(…...
锦程消费金融业务生变:App下架,部分自营信贷暂停
来源 | 镭射财经(leishecaijing) 被誉为消金房抵一哥的锦程消费金融,调整旗下自营信贷业务,展业回归房抵场景。 「镭射财经」独家获悉,锦程消费金融已暂停部分自营小额信贷业务,旗下锦囊贷App已经下架&am…...
Python爬虫在框架下的合规操作与风险控制
大家好!作为一名专业的爬虫代理供应商,我今天要和大家分享一些关于Python爬虫在法律框架下的合规操作与风险控制的知识。随着互联网的发展,数据爬取在商业和研究领域扮演着重要的角色,但我们也必须遵守相关法律和规定,…...
前端页面如何创建表格?table的结构、属性有哪些?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ HTML是什么?⭐ table标签的属性⭐ 注意事项⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏…...
神码ai伪原创工具【php源码】
大家好,小编为大家解答python炫酷烟花表白源代码的问题。很多人还不知道html代码烟花特效python,现在让我们一起来看看吧! 火车头采集ai伪原创插件截图: 目录 前言 环境准备 代码编写 效果展示 前言 Python实现浪漫的烟花特效 现在…...
Linux命令200例:mkdir用于创建目录(常用)
🏆作者简介,黑夜开发者,全栈领域新星创作者✌。CSDN专家博主,阿里云社区专家博主,2023年6月csdn上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 &…...
C语言内嵌汇编
反编译(二进制文件或者so库) objdump --help objdump -M intel -j .text -ld -C -S out > out.txt #显示源代码同时显示行号, 代码段反汇编-M intel 英特尔语法-M x86-64-C:将C符号名逆向解析-S 反汇编的同时,将反汇编代码和源代码交替显…...
《网络是怎样连接的》(三)
《网络是怎样连接的》(二.2)_qq_38480311的博客-CSDN博客 本文主要取材于 《网络是怎样连接的》 第三章。 简述:本文主要内容是解释 通过网线传输出去的包是如何经过集线器、交换机和路由器等网络设备,最终进入互联网的。 信号…...
SpringBoot 配置文件
一、配置文件作用 整个项目中所有重要的数据都是在配置文件中配置的,比如: 数据库的连接信息(包含用户名和密码的设置); 项目的启动端口; 第三方系统的调用秘钥等信息; 用于发现和定位问题的…...
【K8S】 deployment.yaml文件与Service yaml文件详解
目录 deployment.yaml文件详解Service yaml文件详解 deployment.yaml文件详解 apiVersion: extensions/v1beta1 #接口版本 kind: Deployment #接口类型 metadata:name: cango-demo #Deployment名称namespace: cango-prd #命名空间l…...
GMSL 9296芯片对GMSL链路 插损/回损/线束要求
基于美信 9296的芯⽚ 对于GMSL信号链路上的需求如下: 1:插损 频段2M~3.5GHZ 在3G时需要⼩于-21db。通信速率 6Gbps/187Mbps 频段2M~3.5GHZ 在3G时需要⼩于-18db。通信速率 6Gbps/1.5Gbps 频段2M~2GHZ 在1.5G时需要⼩于-19.5db。通信速率 3Gbps/187Mbps …...
用库造一个list的轮子 【C++】
文章目录 list的模拟实现默认成员函数构造函数拷贝构造函数赋值运算符重载析构函数 迭代器迭代器为什么要存在?const_iteratorbegin和end inserterasepush_back && pop_backpush_front &&pop_frontswap 完整代码 list的模拟实现 默认成员函数 构造…...
java中的,>>,<<位运算
目录 二进制 >>,<< & 二进制 计算机内部使用二进制计数 二进制:在数学和数字电路中指以2为基数的记数系统,以2为基数代表系统是二进位制的,这一系统中,通常用两个不同的符号0(代表零)和…...
成功解决Android设备adb连接后显示device unauthorized
一、提出问题 在电脑通过USB连接新的Android设备,想要通过adb来进行一些操作时,却发现命令提示符上在输入下面命令后显示设备未授权的信息也就是"unauthorized" adb devices二、不可行的解决方案 有人提出的解决方案是打开Android设备的开发…...
初识mysql数据库之引入mysql客户端库
目录 一、下载第三方库 1. 准备工作 1. 使用mysql官网提供的库 2. yum源安装 二、测试第三方库是否可用 三、mysql常用接口介绍 1. 查看官方文档 2. 初始化 3. 关闭mysql 4. 连接mysql 5. 下达sql指令 四、一个简单的C客户端库连接mysql程序 1. 头文件 2. 初始化…...
勘探开发人工智能技术:机器学习(1)
0 提纲 2.1 什么是机器学习 2.2 不确定性 2.3 数据类型 2.4 分类、回归、聚类 2.5 分类问题的训练与测试 2.6 性能评价指标 1 什么是机器学习 对于西瓜这个抽象类来说,它具有“色泽”,“根蒂”,“敲声”三个属性: 通过观察这个…...
MySQL查看当前数据库视图-SQL语句
引言 查询语句为: show full tables where table_type 可查询当前数据库表 一,创建一个视图 # 创建视图 create view v_stu as # 视图内容(连接的一个表) select name from t_stu union all select tname from t_teach; 二&…...
Clickhouse 存储引擎
一、常用存储引擎分类 1.1 ReplacingMergeTree 这个引擎是在 MergeTree 的基础上,添加了”处理重复数据”的功能,该引擎和MergeTree的不同之处在于它会删除具有相同主键的重复项。 特点: 1使用ORDERBY排序键作为判断重复的唯一键 2.数据的去重只会在合并…...
基于golang多消息队列中间件的封装nsq,rabbitmq,kafka
基于golang多消息队列中间件的封装nsq,rabbitmq,kafka 场景 在创建个人的公共方法库中有这样一个需求,就是不同的项目会用到不同的消息队列中间件,我的思路把所有的消息队列中间件进行封装一个消息队列接口(MQer)有两个方法一个…...
【第一阶段】kotlin的函数
函数头 fun main() {getMethod("zhangsan",22) }//kotlin语言默认是public,kotlin更规范,先有输入( getMethod(name:String,age:Int))再有输出(Int[返回值]) private fun getMethod(name:String,age:Int): Int{println("我叫…...
PAM安全配置-用户密码锁定策略
PAM是一个用于实现身份验证的模块化系统,可以在操作系统中的不同服务和应用程序中使用。 pam_faillock模块 pam_faillock模块用来实现账号锁定功能,它可以在一定的认证失败次数后锁定用户账号,防止暴力破解密码攻击。 常见选项 deny&…...
河北邢台做网站/谷歌seo搜索
实现一个简易版的express实现的功能实现步骤总结实现的功能 首先说明一下需要实现那些功能 use函数,这个函数有2个参数,第一个参数是需要匹配的路径,可不传,默认是匹配所有路径,第二个是回调函数。all函数࿰…...
交互网站设计/深圳百度推广排名优化
概述 对于应用开发者来说,数据连接泄漏无疑是一个可怕的梦魇。如果存在数据连接泄漏问题,应用程序将因数据连接资源的耗尽而崩溃,甚至还可能引起数据库的崩溃。数据连接泄漏像黑洞一样让开发者避之唯恐不及。 Spring DAO 对所有支持的数据访问…...
淘宝网站建设的主要工作/商品推广
模板题目: 题目来源 [POJ] Genealogical tree 题目描述: 求1到n的其中一种拓扑序,保证存在一种拓扑序。输入格式是:第一行读入n,接下来n行,第i1行表示有由i指向其他点的边,以0结尾。(直接一个0就是它没有连向任何点&am…...
免费外贸网站/cdq百度指数
一般程序写的爬虫程序都会自带请求头,不知不觉就被网站拒绝了,请求之前可以看看自己的请求头是什么,确保不被禁 地址:https://httpbin.org/ 如果网站太慢打不开,想在本地搭建测试环境,可以在docker环境下…...
万网主机建设网站流程/攀枝花seo
问题: 1、如何仅用队列结构实现栈结构? 2、如何仅用栈结构实现队列结构? 实现思路: 1、使用两个队列结构Queue1和Queue2 ,push操作一样,添加push()到Queue1,pop()核心是把 Queue1 除最后添加的元素"剪切"…...
wordpress支付配置/太原网站开发
面包屑导航的作用是不言而喻的,现在一般大大小小的网站都会做一个面包屑导航功能,这不仅有益于用户的体验,而且对于百度SEO优化来说也是比较重要的!那么ZBlogPHP网站的面包屑导航该怎样写呢?在网上流传最广泛的一种比较…...