【数据库初阶】MySQL中表的约束(上)

【数据库初阶】MySQL中表的约束(下) orders表中的列是外键,它引用customers表中的列。这部分定义了外键约束,确保orders表中的必须是customers表中已存在的值。 阅读详情

图片名称

??博主首页:

??专栏首页: 数据库初阶

??其它专栏: C++初阶 | C++进阶 | 初阶数据结构

在这里插入图片描述

亲爱的小伙伴们,大家好!在这篇文章中,我们将深入浅出地为大家讲解 MySQL中表的约束 帮助您轻松入门,快速掌握核心概念。

如果文章对您有所启发或帮助,请别忘了 点赞 ??、收藏 ??、留言 ?? 支持!您的每一份鼓励,都是我持续创作的源动力。让我们携手前行,共同进步!

文章目录

上一篇文章中,博主介绍了 :

  • MySQL中不同的数据类型

建议将上一篇文章看完之后再来看这篇文章,链接如下:

【数据库初阶】MySQL数据类型

那么接下来正文开始:

0. 什么是表的约束

  • 上一篇文章中讲过,真正表的约束其实是 数据类型;
  • 但是数据类型约束很单一,需要有一些 额外的约束,更好的保证 数据的合法性,从业务逻辑角度 保证数据的正确性。
  • 表的约束有很多,本篇文章主要介绍以下几个:
    • null / not null,
    • default,
    • comment,
    • zerofill,
    • primary key,
    • auto_increment,
    • unique key

1. NULL & NOT NULL

??1.1 关键词解释??

  • NULL 就是空,什么都没有的意思,和语言上的NULL是有点区别的;
  • 在数据库创建中,如果从逻辑角度不想让某一个字段(某一列)为空,就要添加约束条件,NOT NULL。

??1.2 用法示例??

  • 例如,在学校中,从逻辑上讲,每个学生的学号都不可能是空值;

  • 因此可以将这个字段添加约束 NOT NULL;

  • SQL 代码如下:

    mysql> create table if not exists null_test(
    -> stu_id varchar(10) not null,
    -> stu_name varchar(10),
    -> stu_class int
    -> );

  • 查看一下表结构,输入:desc null_test;

在这里插入图片描述

  • 此时,必须在这个表中的每一行添加这个字段的值,不然就会报错:

在这里插入图片描述


2.DEFAULT

??2.1 关键词解释??

  • 在一张表中,某一个字段的值可能 出现的频率比较高;
  • 为了避免重复的输入,可以将这个字段添加约束 DEFAULT 默认值;
  • 下次就不需要手动进行插入,会自动添加到表中;
  • 如果某一行中此字段的值不是默认值,再手动修改,大大提高了效率。

??2.2 用法示例??

  • 例如,在理工类学校中,男生的人数可能比女生的人数要多很多;

  • 那么就可以将性别这个字段添加默认值;

  • 代码如下:

    mysql> create table if not exists default_test(
    -> stu_id int not null,
    -> gender char(1) default ‘男’,
    -> age int unsigned
    -> );
    Query OK, 0 rows affected (0.05 sec)

  • 查看表结构:

在这里插入图片描述

  • 省略gender字段向表中插入数据,那就是默认值,不省略就可以修改:

在这里插入图片描述

??2.3 NOT NULL 和 DEFAULT 区别??

问题1:

  • 先来看下面的一个插入方式,为什么在创建的时候 age 字段没有设置默认值,插入的时候也可以被省略?

在这里插入图片描述

  • 实际上,对于不是 NOT NULL 的字段,MySQL会自动帮我们添加 默认值 NULL,我们可以查看一下MySQL为我们修改的创建表的语法:

在这里插入图片描述

问题2:

  • 我们可以看到:非空约束的默认值也是NULL,为什么呢?

在这里插入图片描述

  • 其实这个NULL的本质是不一样的,如果我们不指定stu_id列插入数据看一下:
    • 可以看到,这里的报错是 没有默认值报的错。

在这里插入图片描述

  • 如果我们指定了这个列,但是插入的是空值看一下:
    • 注意到,这里的报错是 此列不能是空报的错。

在这里插入图片描述

  • 因此,在定义非空约束的表中,MySQL不会帮我们自动生成一个默认值;
  • 对于带有 NOT NULL 约束的字段,DESC 中显示的 Default 为 NULL,这并不表示这个字段的默认值是 NULL。实际上,NOT NULL 约束要求这个字段在插入时不能是 NULL,如果插入时没有提供这个字段的值,MySQL 会报错,报的是没有默认值的错误。

总结:

  • 对于是非空约束的字段:

    • MySQL不会帮我们自动生成一个默认值,如果我们在插入数据的时候不显示指定此列,那么编译器就会报没有默认值的错误;
    • 如果插入数据的时候显示插入值,但是插入的值是NULL,才会报自此段不能为空的错误。
  • 对于不是非空约束的字段:

    • MySQL会自动帮我们生成一个默认值NULL,所以不会报没有默认值的错误。
    • 因为只有设置了default的列,才可以在插入值的时候,对列进行省略。
  • 一般情况下,default 约束和 not null 约束不会一起使用。


3.COMMENT

??3.1 关键词解释??

  • comment 表示列描述,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA来进行了解;

??3.2 用法示例??

  • 创建一个表,描述各个列的含义;

  • 代码如下:

    mysql> create table if not exists comment_test(
    -> name varchar(20) not null comment ‘姓名’,
    -> age tinyint unsigned default 18 comment ‘年龄’,
    -> gender char(1) default ‘男’ comment ‘性别’
    -> );
    Query OK, 0 rows affected (0.08 sec)

  • desc是查不到注释信息的:

在这里插入图片描述

  • 通过 show create table 可以看到:

在这里插入图片描述


4.ZEROFILL

??4.1 关键词解释??

  • 还记得在上一篇文章中讲的数据类型 int 吗,在查表的时候后面的数字代表着什么呢?
  • 其实没有这个zerofill属性,这个数字是没有意义的;
  • 其实这个表示最后用统一的字数显示,如果是 10 10 10,那么最后就是显示 10 10 10位数字,如果实际数字少于 10 10 10 位,就用 0 0 0 补齐,如果多出就不管。

??4.2 用法示例??

  • 创建一个表,里面只有 int,一个int(5),另一个int(10) 这个用zerofill约束;

  • 代码如下:

    mysql> create table if not exists zerofill_test(
    -> a int(5),
    -> b int(10) unsigned zerofill
    -> );

  • 插入数据,代码如下:

    mysql> insert into zerofill_test values(1,2);
    Query OK, 1 row affected (0.01 sec)

    mysql> insert into zerofill_test values(325, 510);
    Query OK, 1 row affected (0.01 sec)

  • 查表:

    mysql> select * from zerofill_test;
    ±-----±-----------+
    | a | b |
    ±-----±-----------+
    | 325 | 0000000510 |
    | 1 | 0000000002 |
    ±-----±-----------+
    2 rows in set (0.00 sec)

  • 其实int默认是 10 10 10 位也是有原因的,因为它的最大值就是二十一亿多( 10 10 10 位数字),unsigned也就是四十二亿多( 10 10 10 位数字)。


5. PRIMARY KEY

??5.1 关键词解释??

  • primary key用来 唯一的 约束该字段里面的数据,不能重复,不能为空;
    • 主键要求表中每一行记录的值都是唯一的,也就是说,主键字段的值不能重复。每行数据的主键值都是唯一的,确保数据的唯一性。
    • 主键字段不能为 NULL。也就是说,在定义主键时,MySQL 会自动给该字段添加 NOT NULL 约束。每一行数据在插入时,主键字段必须提供一个有效的、非空的值。
  • 一张表中最多只能有 一个主键,但可以由一个列或多个列组成(复合主键)。
    • 主键可以由一列或多列字段组成。一个单列主键称为“单列主键”,而由多个列组成的主键称为“复合主键”。
      • 单列主键:表中只有一个字段作为主键。
      • 复合主键:多个字段组合成一个主键,保证唯一性。
  • 主键所在的列通常是 整数类型。

??5.2 用法示例??

5.2.1 单列主键
  • 可以用以下两种方式定义主键:

    #方法1:
    mysql> create table if not exists primarykey_test(
    -> stu_id int,
    -> name varchar(20),
    -> gender char(2) default ‘男’,
    -> primary key(stu_id)
    -> );
    Query OK, 0 rows affected (0.04 sec)

    方法2:

    mysql> create table if not exists primarykey_test(
    -> stu_id int primary key,
    -> name varchar(20),
    -> gender char(2) default ‘男’,
    -> );
    Query OK, 0 rows affected (0.04 sec)

  • 查看创建信息:

    • 发现自动添加了 NOT NULL 约束。

在这里插入图片描述

  • 插入信息,发现如果有了主键约束,此列信息不能重复:

在这里插入图片描述

  • 可以删除主键,代码如下:

    mysql> alter table primarykey_test drop primary key;
    Query OK, 1 row affected (0.16 sec)
    Records: 1 Duplicates: 0 Warnings: 0

    mysql> desc primarykey_test;
    ±-------±------------±-----±----±--------±------+
    | Field | Type | Null | Key | Default | Extra |
    ±-------±------------±-----±----±--------±------+
    | stu_id | int | NO | | NULL | |
    | name | varchar(20) | YES | | NULL | |
    | gender | char(2) | YES | | 男 | |
    ±-------±------------±-----±----±--------±------+
    3 rows in set (0.00 sec)

在这里插入图片描述

  • 删除后可以重新添加,但要 保证添加这一列中没有重复的值!!

    mysql> alter table primarykey_test add primary key(stu_id);
    Query OK, 0 rows affected (0.11 sec)
    Records: 0 Duplicates: 0 Warnings: 0

    mysql> desc primarykey_test;
    ±-------±------------±-----±----±--------±------+
    | Field | Type | Null | Key | Default | Extra |
    ±-------±------------±-----±----±--------±------+
    | stu_id | int | NO | PRI | NULL | |
    | name | varchar(20) | YES | | NULL | |
    | gender | char(2) | YES | | 男 | |
    ±-------±------------±-----±----±--------±------+
    3 rows in set (0.00 sec)

在这里插入图片描述
在这里插入图片描述

5.2.2 复合主键
  • 定义方法,代码如下:

    • 这个表中定义主键的意思是一个学生可以选择多门课,一门课可以被多名学生选择,但是 不存在一名学生重复选择同样的课的情况。

    mysql> create table if not exists primarykey_test2(
    -> stu_id int,
    -> course_id int,
    -> grade int,
    -> primary key(stu_id, course_id)
    );
    Query OK, 0 rows affected (0.04 sec)

  • 查看创建信息和表结构:

在这里插入图片描述

主键的特点与约束:

  • 每个表只能有一个主键,但是主键可以包含多个字段(即复合主键)。
  • 如果表中已经有一个字段被定义为主键,其他字段就不能重复该主键的值。

安卓集成华为HMS Scankit实现自定义扫码功能 实现扫码功能 使用的是集成华为扫描的SDK,UI界面借鉴的是谷歌官方的Zxing项目中的自定义view,两者结合实现。 先上效果图: 先在项目根级别(build.gradle)当中配置HMS Core SDK的Maven仓地址。 // 配置HMS Core SDK的Maven仓地址。 maven {url 'https://developer.huawei.com/repo/'} // 配置HMS Core SDK的Maven仓地址。 maven {url 'https://developer.huaw 阅读详情

相关推荐

OPC UA 协议详解

OPC UA(统一架构)是新一代工业自动化标准通信协议,替代传统OPC Classic,具有跨平台、高安全性、标准化等优势。基于TCP协议,支持全平台部署,采用面向对象架构组织数据,提供实时读写、事件订阅、历史数据访问等功能。作为工业4.0核心协议,适用于智能制造、数字孪生等场景,能实现多品牌设备统一接入。相比Modbus和MQTT,OPC UA协议更规范安全但复杂度较高,是大型工业集群互联的主流选择。

eastyuxiao的专栏 722

【MySQL】数据库中表的约束(一)

本文介绍了MySQL数据库中表的约束条件,主要包括空属性(null/not null)、默认值(default)、列描述(comment)、zerofill和主键(primary key)等。空属性用于保证字段不为空,默认值可设置常用值,列描述用于字段说明但不影响数据,zerofill属性会在数字前补零显示但不改变实际存储值。主键约束确保字段唯一且非空,可以是单列或复合主键,并支持后期添加和删除。这些约束条件有助于保证数据的合法性和业务逻辑的正确性。

大白的编程日记. 1106

PCF8591实战指南:从IIC通信到STM32的ADC/DAC配置(附完整代码)

本文详细介绍了PCF8591芯片在STM32开发中的实战应用,涵盖IIC通信协议、ADC/DAC配置及完整代码实现。通过解析DATA SHEET关键参数,提供硬件连接指南、控制字节配置技巧和常见问题解决方案,帮助开发者快速掌握这款8位模数/数模转换器的使用,实现精确的模拟信号处理。

y7z8a的博客 539

mysql中表的约束

NOT NULL 用于约束表中的某列,要求每一个表项中该列必须有值,不允许存储空值。在创建表时,可以使用 NOT NULL 约束来确保该列必须有值,从而保证数据的完整性和有效性。主键是数据的一个属性,数据库中的表用主键来唯一标识一个对象/一条记录,用户可以通过主键在一张表中快速检索出对应的记录复合主键是指在数据库表中,由两个或两个以上的字段组合而成的主键。外键是一个表中的一列或多列,其值必须与另一个表(通常称为主表)中的主键或唯一键的值相匹配,或者为空值。

codezhu的博客 1233

3D Slicer中文教程(三)—数据加载及保存方式

1.打开数据与保存数据 (1)打开数据 ——可以将数据拖拽到3D Slicer应用窗口或者从菜单栏工具栏打开。 ——多种方式加载大量数据。 有关DICOM数据,请参阅DICOM模块文档。 对于几乎所有其他(包括场景),您可以使用添加数据对话框。 有关支持的数据格式的列表,请参阅此列表。 请注意,仅部分支持列出的某些格式。 ——对于一些更复杂的格式(特别是DWI),建议首先使用DICOM到n...

weixin_33676492的博客 5533

macOS 27下PlayCover“没有权限打开”的完整修复指南

macOS系统通过Gatekeeper、TCC(透明、同意与控制)和安全启动等机制,对第三方应用进行层层校验,以防范恶意代码。这些机制会检查应用的隔离属性、签名状态以及所需系统权限,当任一环节不满足时,就会出现“没有权限打开”的提示。对于开发者工具或未上架App Store的开源软件,这类拦截尤为常见。尤其在macOS 27上,系统进一步收紧了绕过策略,导致PlayCover等工具无法正常启动。本文以PlayCover为例,详细解析权限链路上的三道关卡,并给出清除隔离属性、调整SIP状态、重置TCC记录等完

weixin_32612263的博客 727

【MySQL】数据库中表的约束(二)

MySQL数据库表约束详解(二) 本文继续讲解MySQL中的表约束,重点介绍了三种约束类型: 自增长(auto_increment):与主键搭配使用,自动递增生成唯一值,需注意必须是整数类型且每个表只能有一个自增字段。 唯一键(unique):保证字段值的唯一性但允许为空,适用于业务上需要唯一但不作为主键的字段,可与主键配合使用。 外键(foreign key):建立表间关联关系,确保从表数据必须在主表存在,支持设置为NULL,有效避免数据冗余。 文章通过学生-班级关系等实例演示了约束的实际应用,最后给出了

大白的编程日记. 1065

VOF模型求解方法:从SIMPLEC到PISO的稳定性优化策略

本文深入探讨了VOF模型求解方法中SIMPLEC与PISO算法的稳定性优化策略,重点分析了两种算法在稳态和瞬态问题中的应用差异。通过对比PRESTO离散化方法与其他格式的优劣,提供了针对多相流模拟的实用设置建议和稳定性优化技巧,帮助工程师有效提升计算效率和精度。

yellow的专栏 1153

【MySQL】数据库约束

定义:指定表中的某列不能存储NULL值。例如:在“学生信息表”中,指定学生的姓名不能为空,确保学生基本信息的完整性。定义:在没有给某列赋值是制定一个默认值。定义:确保表中指定列的值是唯一的,当可以为空值。定义:NOT NULL和UNIQUE的结合。确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速的找到表中的一个特定的记录。但每个表只能有一个主键。定义:外键约束用于建立和加强两个表之间的关联。一个表的外键指向另一个表的主键。

2301_80543957的博客 4168

2024 全国大学生新质生产力大赛 B:金融违规交易的大数据分析 问题四思路代码

问题四:请分析附件中所有的指标数据,选取合适的指标,建立“金融违规 洗钱交易的预测模型”,并选取合适的训练集和测试集,计算预测模型的准确率。 为了提前识别并预测金融违规洗钱的交易事件,请基于你们团队数据分析的结果, 分别给公安部门和银行机构提出你们的建议。

YOLO 374

面试真题集(十六):TensorRT基础

TensorRT面试真题解析:从模型优化到推理部署 本文精选了14道TensorRT面试题,涵盖选择题、简答题和场景题,深度考察推理工程师对TensorRT核心技术的理解。内容聚焦三个关键维度: 基础概念 FP16推理中Softmax层为何需保持FP32(数值稳定性) INT8校准原理(EntropyCalibrator2的鲁棒性优势) Plugin V3接口的构建/运行分离设计 性能优化 Conv-BN-ReLU融合减少40-60%延迟的关键机制(访存优化) 动态Shape配置策略(min/opt/max

PeterPan的博客 69

MYSQL数据库初阶 之 表的约束

MySQL中表的约束机制:空属性(null/not null)、默认值(default)、列描述(comment)、zerofill填充等基本约束。约束的主要作用是保证数据的合法性和完整性,通过技术手段强制数据符合业务逻辑要求。空属性约束能防止无效数据插入,默认值约束可简化数据输入,列描述提供字段说明信息,而zerofill则用于数字格式化显示。这些约束条件共同作用,确保数据库存储的数据准确可靠且符合预期规范。

lll_666666的博客 1085

uniapp - 实现APP后台持续定位+手机息屏后能持续上传位置信息数据,详解后台保活持续运行+手机锁屏保证后台持续/实时定位的解决方案及示例源码(完美兼容安卓android与苹果ios系统手机)

使用uniapp开发app实现后台保活定位能力,uniapp实时定位保活 息屏定位后台运行,uniapp APP实时定位高德 后台运行 支持锁屏息屏运行,持续获取定位信息,uniapp App端后台间隔时间发送定位功能实现,UniApp实现手机应用常活,固定时间内上传手机位置信息,后台(或锁屏)持续/实时定位的实现方案,uni-app后台持续定位,锁屏后能持续上传位置信息,实现后台定位持续无限制定位高德定位,百度定位,UniApp后台持续定位保如何在APP退到后台时保持定位服务,uniapp 切换app仍能

🏆 前端领域优质创作者 1万+

MySQL中表的约束

表中一定要有各种约束,通过约束,让我们来插入数据库中的数据是符合预期的。约束本质是通过技术手段,倒逼程序员插入正确的数据;反过来,站在MySQL的角度来单,内部已经插进来的数据,都i是符合数据约束的数据。约束的最终目标:保证数据完整性和可预期性为了完成以上的所有目标,就需要除了数据类型自带的范围约束以外的更多约束。

pouop的博客 1173

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

MySql中表的约束

​ 本篇中将会介绍关于 MySql 数据库中的表的约束,关于表的约束其实约束的是表中的数据类型,因为有的数据类型很单一,需要我们添加一些额外的约束,才能更好的保证数据的合法性,从业务逻辑角度保证数据的正确性,比如QQ号,要求是唯一的。

m0_74830524的博客 933

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

[MySQL初阶]MySQL(3)表的约束

[MySQL初阶]MySQL(3)表的约束 null/not null,default, comment, zerofill,primary key,auto_increment,unique key

石墨博客 1793

MySQL数据库——约束

详细讲解MySQL数据库的各种约束

不能再留遗憾了的博客 2513
上一篇: 【Redis】redis入门+java操作redis
下一篇: 使用Springboot实现MQTT通信
普通网友
博客等级 码龄5年 7349粉丝 172原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值