MySQL表的约束(一)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL表的约束

真正约束字段的是数据类型,若插入的数据超出了对应数据类型的取值范围,那么数据将会插入失败

数据类型的约束很单一,为了更好的保证数据的合法性,从业务逻辑角度保证数据的正确性,MySQL中出现了表的约束,目的就是为了尽可能保证数据安全,减少用户的误操作可能性

表的约束有很多,本篇博客主要介绍如下几个:null/not null、default、comment、zerofill、primary key、auto_increment、unique key、foreign key

一、空属性

空属性有两个值,分别是null和not null

数据库默认字段基本都是允许为空的,但在实际开发中要尽可能保证字段不为空,因为空值无法参与运算

058805bfdccc4f659712e482f672409a.png


由于空值无法参与运算,因此null值加一后得到的还是null


a827dd4ab0a441b0be051c5808e97d36.png


若要让某个字段不允许为空,在创建表的时候就可以给对应字段设置not null属性。比如创建一个班级表,表中包含班级名和该班级所在的教室,若插入数据时不想让这两个字段为空,就可以在创建表时给这两个字段设置not null属性


77d8dd217211494babce6fdb4e329071.png


创建表完毕后查看表结构,可以看到这两个字段不允许为空

834eca23434f4c9dbf2607ee4af8afea.png



表中插入记录时只有这两个字段都不为空时才能插入成功,否则将会插入失败


bed20cb88d2544b49bd1af96ce21ec59.png


二、默认值

若某一个字段会经常性的出现某个值,那么就可以考虑将这个值设置成该字段的默认值

向表中插入数据时如果不给带有默认值的字段赋值,那么就会使用默认值进行插入

如创建一个用户表,表中包含用户的姓名、年龄和性别,将用户的年龄默认设置成18,将用户的性别默认设置成男


189f1006e76e43b5a6f3ab1748f8131f.png


创建表完毕后查看表结构,可以看到默认值已设置成功


7af24a1215e94feeba33cf9aa8a28af4.png


向表中插入数据时,若不指明用户的年龄或性别,那么就会使用对应的默认值,若指明则会使用用户指定的值


f792195697524499ab8e14c6b4144ea6.png


同时设置not null和default


一旦给某一字段设置了默认值,那么该字段将不会出现空值,因为就算插入数据时没有指明该字段的值,也会使用该字段的默认值进行填充。

而给某一字段设置not null属性的目的是约束该字段不能为空,因此一个字段设置了default属性后,再设置not null属性就没有意义了


比如创建一个id表,表中包括姓名和id,将id同时设置default和not null属性


e87a2924232a49708aea33fde58d4ec6.png


创建表完毕后查看表结构,可以发现id字段不允许为空,并且其默认值是1


59567986f0174b06a87c8f8484ba9100.png


在向表中插入数据时可以不指明id进行插入,此时会使用id的默认值


5c176e69a4354e828c50c39dfff45c1c.png


三、列描述

列描述是在创建表时用来对各个字段进行描述的,列描述会根据表创建语句保存,一般用来给程序员或DBA了解表的相关信息,相当于注释


如创建一个用户表,表中包含用户名、用户年龄和用户性别,在每一个字段后面添加上对应的列描述


90fc8aca96424565a011f8b8609499a9.png


创建表完毕后,通过show create table 表名可看到创建表时的相关细节,包括列描述


14aeb111428649d4931331fc6aa5150c.png


四、zerofill

zerofill


数值类型后面的圆括号中的数字,代表的是显示宽度,对应数值类型设置zerofill属性后,若数据的宽度小于设定的宽度则自动填充0


如创建一个表,表中包含a和b两列整型数据,将其显示宽度都设置成5,但只有b设置zerofill属性


6502179d3ee648d3aaf031d38b406024.png


向表中插入一条记录,指明a和b的值均为1,由于没有给a字段设置zerofill属性,因此查看表中数据时a显示出来的是1,并没有显示宽度的概念。b列有zerofill属性,由于b列数据的显示宽度为5,因此查看表中数据可以看到b列数据中宽度不足5位的数据都自动在前面填充0


d9d2399d1c5c4160a3820564c6dd8b5f.png


zerofill属性的作用就是让数据以特定的方式进行显示而已,数据底层的储存方式并没发生变化,通过hex函数可以看到b列中显示的00001在底层实际储存的还是1


af3a8736a8dd453d8833a049af04208d.png


五、主键

主键


向表中插入一条条记录后,为了方便后续进行查找,可以选择其中的某一字段作为键值key,当需查找记录时就根据这个键值key来查找对应的记录

主键用来唯一的约束该字段里面的数据,表中每条记录的主键不能重复也不能为空,并且一张表里面只能有一个主键。主键所在的列通常是整数类型

如创建一个学生表,表中包含学生的学号和姓名,学生的学号是不会重复的,可以将其设置成主键


2570141e3ec244e889a14ef64a3d1e0a.png


创建表成功后查看表结构,可以看到id对应的Key列出现了PRI,这表示已成功将学号设置成这张表的主键。虽然在创建表的时候没有给学号设置not null属性,但由于主键本身就是不能为空的,因此id默认也就不能为空了


a1c9a28a05694754a9ce77a0c5c30acc.png


主键约束就是,插入表中的记录的主键字段不能重复,若插入记录的主键与表中已有记录的主键重复,此时就会因为主键冲突而插入失败


ffe29991bdad49d19679685d130733c9.png


使用alter table 表名 drop primary key即可删除指定表的主键。一个表只有一个主键,因此删除主键时只用指明要删除哪张表的主键即可。如删除学生表的主键后再查看表结构,可以看到id对应的Key列的PRI已经没有了


164f826fb1254a1d808dff77138a75fa.png


对于已创建好的表,使用alter table 表名 add primary key(列名)可以给指定列设置成主键,但只有列中的值不为空且不重复的列才能被设置成主键。如重新将学号设置成学生表的主键后再查看表结构,可以看到id对应的Key列的PRI又回来了


b4d1313736ba49ae9742c80174d294fd.png


复合主键


一张表中只能有一个主键,但一个主键可以由多个字段来承担,这种主键被称为复合主键

复合主键用来唯一约束多个字段里面的数据,表中每条记录的这多个字段不能同时重复也不能为空

如创建一个进程表,表中包含进程的IP地址、端口号和进程的相关信息,并将IP地址和端口号组合形成一个复合主键


271946e3b0b34956ab8da1f0dfeb1102.png


创建完毕后查看表结构,可以看到ip和port的Key列都有PRI标志,且都不允许为空


0074e7e39c9144468d55b0b45ef2ce02.png


向进程表中插入数据时,只有插入进程的IP和端口均出现冲突时才会产生主键冲突,否则就允许插入


6b7a5119742d4943966224a8889200b9.png


查看表中插入的数据可以看到,表中有重复的IP地址,也有重复的端口号,但是不会出现IP和端口均重复的情况


f15088b13ca04cd5aac9d86e3bd0b1b6.png


使用alter table 表名 drop primary key可以删除指定表的复合主键,如删除进程表的复合主键后再查看表结构,可以看到ip和port对应的Key列的PRI都没有了


fd250f77493d487590ce2c57f5771959.png


对于已创建好的表,可以使用alter table 表名 add primary key(多个列名)用多个列形成复合主键,但被选取的多个列中的值不能为空且不能同时出现重复。如重新将ip和port设置成进程表的复合主键后再查看表结构,可以看到ip和port对应的Key列的PRI又回来了



352b830ab9e74c238fd0c3afd72f272e.png


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
6天前
|
运维 DataWorks 关系型数据库
DataWorks产品使用合集之DataWorks还有就是对于mysql中的表已经存在数据了,第一次全量后面增量同步的步骤如何解决
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
38 2
|
4天前
|
关系型数据库 MySQL Java
实时计算 Flink版产品使用合集之mysql通过flink cdc同步数据,有没有办法所有表共用一个dump线程
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
9 0
|
6天前
|
SQL 关系型数据库 MySQL
MySQL数据库的约束+进阶版新增与查询-2
MySQL数据库的约束+进阶版新增与查询
16 1
|
6天前
|
关系型数据库 MySQL 测试技术
MySQL数据库的约束+进阶版新增与查询-1
MySQL数据库的约束+进阶版新增与查询
17 1
|
6天前
|
SQL 存储 关系型数据库
【MySQL】DDL的表操作详解:创建&查询&修改&删除
【MySQL】DDL的表操作详解:创建&查询&修改&删除
|
6天前
|
存储 SQL 关系型数据库
mysql查询数据库表大小怎么操作
mysql查询数据库表大小怎么操作
|
6天前
|
关系型数据库 MySQL 数据库
【MySQL】:约束全解析
【MySQL】:约束全解析
26 0
|
6天前
|
存储 SQL 关系型数据库
MySQL表的增删改查---多表查询和联合查询
MySQL表的增删改查---多表查询和联合查询
|
6天前
|
NoSQL 关系型数据库 MySQL
【MySQL探索之旅】MySQL数据表的增删查改——约束
【MySQL探索之旅】MySQL数据表的增删查改——约束
|
6天前
|
存储 关系型数据库 MySQL
{MySQL} 数据库约束& 表的关系& 新增&&删除& 修改& 查询
{MySQL} 数据库约束& 表的关系& 新增&&删除& 修改& 查询
22 0