Mysql表的约束

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云原生数据库 PolarDB 分布式版,标准版 2核8GB
简介: 本文详解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也是正确的。


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3月前
|
关系型数据库 MySQL 数据库
数据迁移脚本优化过程:从 MySQL 到 Django 模型表
在大规模的数据迁移过程中,性能问题往往是开发者面临的主要挑战之一。本文将分析一个数据迁移脚本的优化过程,展示如何从 MySQL 数据库迁移数据到 Django 模型表,并探讨优化前后的性能差异。
|
11天前
|
存储 关系型数据库 MySQL
MySQL数据库基础:约束
约束是对数据库表中字段施加的规则,确保数据的正确性、有效性和完整性。主要分为非空约束、唯一约束、默认约束、主键约束和外键约束。非空约束禁止字段值为null;唯一约束确保字段值唯一,允许null值重复;默认约束设定默认值;主键约束结合非空与唯一约束,并可设为自增型;外键约束则通过关联其他表的主键,保证数据一致性。检查约束确保字段值满足特定条件。
26 1
|
1月前
|
数据采集 关系型数据库 MySQL
在 MySQL 中使用约束
【8月更文挑战第11天】
34 0
在 MySQL 中使用约束
|
2月前
|
存储 SQL 关系型数据库
MySQL设计规约问题之在数据库设计中,为什么要适当考虑反范式的表设计
MySQL设计规约问题之在数据库设计中,为什么要适当考虑反范式的表设计
|
2月前
|
SQL 存储 数据库
MySQL设计规约问题之如何处理日志类型的表
MySQL设计规约问题之如何处理日志类型的表
|
3月前
|
SQL 关系型数据库 MySQL
MySQL----约束
MySQL----约束
27 1
|
2月前
|
运维 关系型数据库 MySQL
实时计算 Flink版产品使用问题之在处理MySQL表新增数据记录时,没有正确触发变更事件,该如何解决
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
3月前
|
数据采集 关系型数据库 MySQL
MySQL数据库基础第三篇(约束)
MySQL数据库基础第三篇(约束)
|
3月前
|
关系型数据库 MySQL
蓝易云 - 如何修复MySQL中损坏的表
最后,为了防止数据丢失,定期备份数据是非常重要的。
139 3
|
3月前
|
SQL 关系型数据库 MySQL
ClickHouse(23)ClickHouse集成Mysql表引擎详细解析
ClickHouse的MySQL引擎允许执行`SELECT`查询从远程MySQL服务器。使用`MySQL('host:port', 'database', 'table', 'user', 'password'[,...])`格式连接,支持简单`WHERE`子句在MySQL端处理,复杂条件和`LIMIT`在ClickHouse端执行。不支持`NULL`值,用默认值替换。系列文章涵盖ClickHouse安装、集群搭建、表引擎解析等主题。[链接](https://zhangfeidezhu.com/?p=468)有更多
166 0

相关产品

  • 云数据库 RDS MySQL 版