Mysql表的约束

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云数据库 RDS SQL Server,独享型 2核4GB
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 本文详解Mysql表的约束类型的概念、使用、区别和联系。

一:空约束

1.1:not null

创建一个案例表:

课程名为空:会不知道上什么课

教室名为空:会不知道在哪里上课

image.png

image.png

如果只插入课程名,会提示教室名没有默认的值。

这是因为:一列如果约束为not null,插入的时候首先检查是否有default value,如果有,就设置为其,如果帘default value都没有,那就会报错,提示不能为空。


1.2:null

插入的时候允许值为空,这样的话插入的时候即使不指定该列,该列也会为空:

这里我们创建了一个三列的表。name class id

image.png

但是!全列插入省略全部列名的时候,是会报错的:

image.png

1.3:default value

默认值:某一个数据会经常的出现某一个具体的值,可以事先设定好这个值,在用户可以选择默认值使用。

image.png

image.png

注意和null和not null一样,就算有默认值,就算可以为空,也不能直接使用全列插入(省略所有列名),依然需要指定列名才能正确插入。

接下来理解一下not null和default的关系:

image.png

image.png

插入是成功的,sex列是不允许为空的,但是有默认值,所以null会先检查有无default,有就使用,没有就报错。


注意:带有default 和null的列,才可以在插入的时候省略单独的该列名进行插入。但是不能进行全部省略列名的插入。

二:列描述

image.png

类似于注释,但是desc看不到注释,可以通过show查看

image.png

注:\G 是一个命令行实用程序,用于显示查询结果的垂直格式。它主要用于 mysqldump 工具中,以在输出中创建更整洁的表格。

三:zerofill

一开始学习的时候,int(10)这里我理解为只能插入8位数字,其实是大错特错,整形是4字节码,这个8又代表什么呢?

image.png

当我们没有添加zerofill的时候,表是这样的。

image.png

增加zerofill约束后,建表语句也有所变化。

image.png

此时a就变成了一个10位的int类型。

这次可以看到a的值由原来的1变成00001,这就是zerofill属性的作用,如果宽度小于设定的宽度(这里设置的是

5),自动填充0。要注意的是,这只是最后显示的结果,在MySQL中实际存储的还是2。为什么是这样呢?我们可以用hex函数来证明。

image.png

四:主键

主键:primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,也就是不能省略该列名直接插入(但是如果给了默认值或者自增长约束可以省略主键列名插入),一张表中最多只能有一个主键;主键

所在的列通常是整数类型。

4.1:创建方式

4.1.1:建表时创建的2种

image.png

image.png

4.1.2:建表后修改约束为主键

image.png

alter table tablename  modify 列名 约束;, 可以直接修改列的约束

image.png

alter table tablename add primary key(列名); ,可以为该列添加主键

对应的删除主键:

alter table drop primary key;

4.2:复合主键

image.png复合主键语法不是这样的。

正确语法:在创建表末尾添加primary key(需要的主键字段列表)如:

image.png

image.png

首先主键的插入不能为空,

image.png

主键不能插入重复值,但是一个学生会选多个课程,这里我们采用复合主键后,约束就变成了只要2个不同时都重复就可以正确插入。

image.png



现在是报错了。

五:自增长

image.png

注意:auto_increment 不能与default一起使用。

去除default后我们连续插入3个值

本来主键插入不能为空,也就是不能省略该列名插入,但是如果和自增长一起用,就可以省略。

image.png

自增长的特点:

  • 自增长的字段必须在key列有值,比如主键,唯一键,外键,复合主键等。通过desc 表名查看
  • 自增长字段数据类型必须是整数
  • 一张表只能存在一个自增长字段

如果我们先删除上面数据再插入几条,id会从多少开始呢,还是1吗?

删除语法:delete from 表名 condition

image.png

image.png

可以看到自增长一定是会保存上一次插入的最后一个数,然后下一次插入从这个数+1开始。

通过show last_insert_id();可以查看

image.png

六:唯一键

一张表只能有一个主键,但是往往一张表需要多个唯一性,比如:

唯一键和主键的区别:

  • 唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。

关于主键和唯一键的区别:

主键是标识唯一性用的,唯一键更多的是保证业务上,不要和别的信息发生冲突。例如:

我们在公司需要设计一张员工表,员工表中有2个字段,一个是身份证号,一个是员工id。

肯定是需要通过身份证号来标识员工的唯一性的,所以我们设置身份证号为主键。

员工id肯定也是不能冲突的,所以设置员工id为唯一键,具体指的是员工在进行相关业务处理的时候,要保证业务的唯一性。


一般而言:我们会将与当前业务不想关的又需要唯一性的字段设置为主键,这样在进行相关业务调整的时候,不用太多的调整。

image.png

如图,唯一键可以为空插入。


七:外键

image.png

有2张这样的表,学生的班级号一定存在于班级表中的班级号,不可能出现班级表中班级号以外的值。

因此在对学生表进行增删查改的时候,班级号肯定是与班级表中的班级号是对应的。因此我们引入外键。

语法:

  • 外键定义在从表上
  • 创建外键的列数据必须在主表存在或者其本身为NULL
  • 指定数据表的存储引擎是innodb
  • 引用键(主表的)必须为索引(目前我们只知道唯一键和主键)

image.png

创建这样2张表,主表为class,从表位student。

image.png

image.png

当插入班级号为3的学生时报错,这是因为从表违反了规定:外键数据必须在主表列中存在。

image.png

们也说过:外键数据必须在主表列中存在或者为null,因此插入null也是正确的。


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4天前
|
SQL 关系型数据库 MySQL
Mysql基础第二十四天,创建表和操纵表
Mysql基础第二十四天,创建表和操纵表
21 0
Mysql基础第二十四天,创建表和操纵表
|
12天前
|
存储 JSON 关系型数据库
一文搞懂MySQL表字段类型长度的含义
一文搞懂MySQL表字段类型长度的含义
21 0
|
13天前
|
分布式计算 DataWorks 关系型数据库
DataWorks支持将ODPS表拆分并回流到MySQL的多个库和表中
DataWorks支持将ODPS表拆分并回流到MySQL的多个库和表中
19 4
|
2月前
|
SQL 存储 关系型数据库
【MySQL】如何通过DDL去创建和修改员工信息表
【MySQL】如何通过DDL去创建和修改员工信息表
33 1
|
2月前
|
关系型数据库 MySQL 数据库
MySQL数据库——约束
MySQL数据库——约束
|
4天前
|
SQL 关系型数据库 MySQL
【MySQL 数据库】2、MySQL 的数据控制语言、函数和约束
【MySQL 数据库】2、MySQL 的数据控制语言、函数和约束
18 0
|
3天前
|
SQL 关系型数据库 MySQL
MySQL表的增删改查(进阶)
MySQL表的增删改查(进阶)
|
3天前
|
SQL 存储 关系型数据库
MySQL表的增删改查(基础且保姆级的教程)
MySQL表的增删改查(基础且保姆级的教程)
|
26天前
|
关系型数据库 MySQL 数据库
MySQL员工打卡日志表——数据库练习
MySQL员工打卡日志表——数据库练习
112 0
|
26天前
|
存储 关系型数据库 MySQL
MySQL技能完整学习列表5、数据库操作——3、索引(Indexing)——4、约束(Constraints)
MySQL技能完整学习列表5、数据库操作——3、索引(Indexing)——4、约束(Constraints)
32 0

相关产品

  • 云数据库 RDS MySQL 版