【MySQL】详谈约束

在这里插入图片描述

👦个人主页:@Weraphael
✍🏻作者简介:目前学习计网、mysql和算法
✈️专栏:MySQL学习
🐋 希望大家多多支持,咱一起进步!😁
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注✨


前言

在数据类型篇章,我们证明了数据类型本身就是一种约束通过约束,数据库可以保证数据的合法性和准确性,避免不合法或无效的数据进入数据库。但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。比如有一个字段是QQ号,要求是唯一的,那么就需要为这个字段设置 【唯一约束】

  • 表的约束很多,这里主要介绍如下八个:
    • 空属性null/not null
    • 默认值default
    • 列描述comment
    • zerofill
    • 主键primary key
    • 自增长auto_increment
    • 唯一键unique key
    • 外键

目录

  • 前言
  • 一、空属性null/not null
  • 二、默认值default
  • 三、列描述comment
  • 四、zerofill
  • 五、主键primary key
  • 六、自增长auto_increment
  • 七、唯一键unique
  • 八、外键
  • 九、综合案例

一、空属性null/not null

MySQL中,当创建表时,可以使用 nullnot null 来定义列是否允许存储null

  • null:表示该列可以存储null
  • not null:表示该列不允许存储null

注意:如果不明确指定列的空属性,默认情况下,列的默认值就是null。如果希望某列不允许为空,则需要显式地将其设置为 not null

  • 注意:区分空值``null

MySQL中,空值表示字段中没有具体数值或内容,但仍然有数据类型;而null值表示缺少值或未知值,实际上是真的没有值。

【语法】

字段 数据类型 [not null];

这种约束其实在生活中非常常见,比如要报考四级,那么就必须去官网报名,而报名的前提就是要注册。当我们看到注册列表前有*,那么说明此信息必填,如果有其中一个不填,那么系统就不让你注册,这就是空属性的约束。

在这里插入图片描述

【使用案例】

创建一个班级表供学生使用,包含班级名、班级所在的教室和授课老师。

站在正常的业务逻辑中:

  • 如果班级没有名字,你不知道你在哪个班级。
  • 如果教室名字可以为空,就不知道在哪上课。
  • 而老师学生一般不怎么关心,只要能到班级上课就行

所以我们在设计数据库表的时候,一定要在表中进行限制,满足上面条件的数据就不能插入到表中。这就是 【约束】

  • 建表

在这里插入图片描述

  • 查看表结构

在这里插入图片描述

YES代表字段的值可以为空null,而NO代表字段的值不可为null

  • 向表中插入数据

在这里插入图片描述

如果不对class_nameclass_room插入元素或者插入的值为null,那么必定会触发错误。

在这里插入图片描述

二、默认值default

MySQL数据库中,可以为表中的列设置默认值。它的作用是:如果没有为该列提供值,将会自动使用默认值填充该列(默认情况下,列的默认值就是null值),如果有则使用用户提供的值。(类似于C++的默认参数

【用法】

在这里插入图片描述

如果不对gender字段插入指定数据,那么就会使用默认值'男'

在这里插入图片描述

三、列描述comment

MySQL中,使用comment关键字可以为字段添加描述信息,以便记录该列的含义、用途或其他相关信息。这些描述信息对于开发人员、数据库管理员和其他使用者来说都是非常有用的,可以帮助他们更好地理解和使用数据库表的结构。(本质上就是注释

MySQL中,可以通过以下方式为列添加描述:

在这里插入图片描述
那么开发人员要如何查看这些描述信息呢?使用以下命令

show create table [表名] \G
# \G - 人性化显示

在这里插入图片描述

四、zerofill

MySQL中,zerofill 是一种列属性,一般用于无符号整型数据类型。其作用是:在显示数值型字段时,在该字段值的前面填充零,以达到指定的位数。这主要用于美化数据展示和保持数据的一致性。(本质上就是格式化输出

【语法】

# 以int整型为例
字段 int(num) unsigned zerofill

一般情况下,其中num表示字段的显示宽度,即显示的最大位数。如果不显示指定num,默认num = 10

【使用案例】

例如,如果创建了一个表d9,并且指定了一个 zerofill 属性的整数列,当在该列中插入一个数字时,MySQL会用零来填充该数字,直到达到指定的位数。这样有助于保持数据的可读性和一致性。

在这里插入图片描述

如果插入一个值为1的记录到num列中,MySQL将会以零填充,直到达到指定位数,显示为001

但是如果插入的值的位数超过了指定位数,那么还是以插入的值为保准来存储,不会发生截断

在这里插入图片描述

需要注意的是,使用zerofill属性仅影响在查询结果中显示的值,实际存储在数据库中的值并不会被修改

在这里插入图片描述

五、主键primary key

MySQL中,主键是用于唯一标识表中每一行数据的字段或字段组合。主键具有以下特性:

  • 唯一性:主键列的值必须是唯一的,不允许出现重复的值。
  • 非空:主键列的值不能为NULL,即不能为空。
  • 一张表只能有一个主键。

通常情况下,可以通过在创建表时使用primary key关键字来指定主键,示例如下:

# 写法一:
create table 表名(
    id int primary key,
    name varchar(32)
);

# 写法二:	
create table 表名(
    id int,
    name varchar(32),
    primary key(id)
);

在这里插入图片描述

注:Key字段代表索引信息。如果Key字段为PRI,表示该列是表的主键

在上述示例中,id字段被指定为主键。如果需要多个字段作为主键,可以使用复合主键

create table 表名(
    字段1 类型,
    字段2 类型,
    ...
    primary key(字段1, 字段2, ...)
);

这里要注意复合主键的唯一性,要将复合主键看成一对。在上面的示例中,(字段1, 字段2) 组合成了一个复合主键。这意味着每一组(字段1, 字段2) 的值必须是唯一的,确保了表中的每行数据都有一个唯一标识符。

假设只有一对复合主键(a, b),且有数据(1,1),如果插入(1,2)或者(2,1)并不会触发唯一性约束,因为每个单独的值并不会导致复合主键重复。只有当插入的复合主键值正好与现有行的复合主键值完全相同时,比如 (1, 1),才会触发唯一性约束。

在这里插入图片描述

【其他操作】

  • 添加主键

添加的前提:所添加主键的字段必须满足非空性和唯一性。建议:在建表时就把主键确定下来

alter table 表名 add primary key(字段1, 字段2, ...);
  • 删除主键
alter table 表名 drop primary key;

六、自增长auto_increment

MySQL中,可以通过使用自增长来为表中的某一列创建自增长的值。当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。

特点如下:

  • 任何一个字段要做自增长,前提是主键
  • 自增长字段必须是整数

【使用案例】

在这里插入图片描述

那我们怎么知道当前字段中的最大值是多少呢?

  • 使用函数last_insert_id
select last_insert_id();

在这里插入图片描述

因此,MySQL默认是从0开始自增长的。当插入新行数据时,可以不必指定自增长列的值,数据库会自动为该列分配下一个可用的自增值。

在这里插入图片描述

七、唯一键unique

一个人的信息往往有很多需要唯一性,也就是说数据不能重复,但是一张表中只能有一个主键。

因此在MySQL中,唯一键就可以解决表中有多个字段需要唯一性约束的问题

这样一看,唯一键好像和主键差不多,可其实并不是。主键除了保证数据的唯一性,还要保证非空性,而唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。

在这里插入图片描述

然而,如果在一个唯一键字段上再增加一个非空约束,那么这个字段的属性就和主键相似了

在这里插入图片描述

但还是会有些区别:我们可以简单理解成,主键更多的是标识唯一性的。而唯一键更多的是保证在业务上,不要和别的信息出现重复

八、外键

以上学习的约束都是内聚在一张表内的某一字段。在MySQL中,外键是一种用于建立 表与表之间关联关系的约束

外键常用于定义主表从表之间的关系,那什么是主表?什么是从表呢?

  • 首先,外键所在的表是从表,被外键关联的表是主表( 外键约束要定义在从表上
  • 被外键关联的主表的列必须是唯一的(主表则必须是有主键约束或unique约束

当定义外键后,要求外键列数据必须在主表的主键列存在或为null。并且如果主表的某列被从表引用为外键,那么这个主表的列不能进行任何修改!

【语法】

foreign key (从表字段名) references 主表名()

【使用案例】

在这里插入图片描述

对上面的示意图进行设计:

  • 先创建主键表myclass

在这里插入图片描述

  • 再创建从表

在这里插入图片描述

  • 插入数据

【主表】

在这里插入图片描述

【从表】

在这里插入图片描述

  • 向学生表stu插入一个班级号为3的学生,由于myclass表中没有这个班级,所以受外键约束,插入不成功

在这里插入图片描述

  • 插入班级idnull,比如来了一个学生,目前还没有分配班级

在这里插入图片描述

九、综合案例

有一个商店的数据,记录客户及购物情况,有以下三个表组成:

  • 商品goods(商品编号goods_id,商品名goods_name, 单价unitprice, 商品类别category, 供应商 provider)

  • 客户customer(客户号customer_id,姓名name,住址address,邮箱email,性别sex,身份证card_id)

  • 购买purchase(购买订单号order_id,客户号customer_id,商品号goods_id,购买数量nums)


  1. 创建商品数据库表
create table goods(
     good_id int primary key auto_increment comment '商品编号',
     goods_name varchar(32) not null comment '商品名',
     unitprice float not null comment '商品单价',
     category varchar(32) set('零食','饮料', '生活用品') not null comment '商品类别',
     provider varchar(32) not null comment '供应商'
);
  1. 创建客户数据库表
create customer(
    customer_id int primary key auto_increment comment '客户编号',
    customer_name varchar(32) not null comment '客户姓名',
    address varchar(256) not null comment '客户地址', 
    email varchar(64) unique key comment '电子邮箱',
    sex enum('男','女') not null comment '性别'
    card_id char(18) unique  key comment '身份证'
);
  1. 对购买订单创建数据库表
create table if not exists purchase
(
    order_id int primary key auto_increment comment '订单号',
    customer_id int comment '客户编号',
    goods_id int comment '商品编号',
    nums int default 1 comment '购买数量',
    foreign key (customer_id) references customer(customer_id),
    foreign key (goods_id) references goods(goods_id)
);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/493133.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PostgreSQL中控制文件的解析与恢复

最近遇到有人问起PG中控制文件的一些使用问题,总结了一下。 1、PG控制文件简介 1.1、存储的位置 它的路径位于: 相关信息,可以用命令pg_controldata得到: [10:41:27-postgres@centos2:/var/lib/pgsql/14/data/global]$ pg_controldata -D $PGDATA pg_control version …

git提交和回退

目录 一. git 提交二. git commit 后准备回退,尚未 git push三. git add 添加多余文件 撤销操作四. 更改 Git commit 的默认编辑器五. 撤销某个commit的变更六. 回退到之前的commit状态总结: 一. git 提交 git pull # 更新代码 git status # 查看代码状…

【保姆级讲解如何Stable Diffusion本地部署】

🌈个人主页:程序员不想敲代码啊🌈 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家🏆 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提…

rancher2.6部署

rancher2.6部署 1、准备环境镜像 2、部署3、密码获取密码设置新密码 4、设置语言5、导入已有集群 1、准备 环境 docker-ce-20.10.23-3.el8.x86_64.rpm以及依赖rpm kubernetes:v1.23.17 镜像 (rancher和k8s有个版本对应关系,rancher2.5就不…

OSCP靶场--GLPI

OSCP靶场–GLPI 考点(CVE-2022-35914 php执行函数绕过ssh端口转发jetty xml RCE) 1.nmap扫描(ssh端口转发) ## ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.194.242 -sV -sC --min-rate 2500 Starting Nmap 7.92 ( https://nmap.org ) at 2024-03-26 22:22 EDT Nmap…

第一个JDBC程序

一、JDBC的概念: JDBC 是 Java DataBase Connectivity (Java 数据连接)技术的简称,是一种可用于执行 SQL 语句的 Java API。它由一些 java 语言编写的类和接口组成;程序员通过使用 jdbc 可以方便地将 SQL 语句传送给几乎任何一种数据库。 二…

C++ :STL中vector扩容机制

vector是STL提供的动态数组,它会在内部空间不够用时动态的调整自身的大小,调整过程中会有大量的数据拷贝,为了减少数据拷贝的次数vector会在调整空间的时候尽量多申请一些空间,这些预留出的空间可以很大程度上减少拷贝的发生。 在…

Shadow Tactics

本题链接: 题目: 样例: 输入 1 1 3 3 U 2 2 2 输出 YES 思路: 根据题意,隼人的坐标是不会动的,并且士兵只能直线来回行动。 所以这里我们需要分成三种情况。 1、隼人坐标在士兵走动路线之间,…

linux如何查看编译器支持的C++版本(支持C++11、支持C++14、支持C++17、支持C++20)(编译时不指定g++版本,默认使用老版本编译)

参考:https://blog.csdn.net/Dontla/article/details/129016157 C各个版本 C11 C11是一个重要的C标准版本,于2011年发布。C11带来了许多重要的改进,包括: 智能指针:引入了shared_ptr和unique_ptr等智能指针,用于更好地…

http认证

1.Digest认证 各字段含义: Nonce 服务器直接返回的数据 H1MD5(user”:”realmpassword) H2MD5(method”:”url) method为请求类型、url不包括域名 Nc 指当前的第几次请求,使用8位16进制显示 Cnonce 8位随机字符串 ResponseMD5(H1”:”nonce”:”…

【C++语言】冲突-C语言:命名冲突(输入输出、缺省参数、引用、内联函数)

文章目录 前言正文2. C的输入与输出:3.缺省参数3.1 缺省参数的概念:3.2 缺省参数的分类:全缺省参数:半缺省参数: 4.函数重载4.1 函数重载的概念: 5.引用5.1 引用的基本概念:5.2 引用的特性&…

系统工程学思想

系统工程学思想 大项目或复杂问题的实施和解决,需要按照系统工程学理论进行,以系统的方法完整、全面的分析,而不是零星的处理问题,沿着逻辑推理的路径,去解决哪些原本靠直觉判断处理的问题。 系统分析过程逻辑结构分为…

A Review on Influence Dissemination in Social Networks

Abstract 影响力传播研究是社交网络信息传播的关键问题。由于影响力分析在营销、广告、个性化推荐、舆情监测等方面的现实意义,研究人员从不同角度研究了该问题并提出了解决方案。在本文中,我们回顾了社交网络中的影响力传播,并得出结论&…

淘宝APP详情数据抓取技术揭秘:用Python实现自动化数据获取(附代码实例)

获取淘宝APP详情数据接口通常涉及到网络爬虫技术,因为淘宝作为一个大型电商平台,其数据并不直接对外公开提供API接口供第三方开发者使用。然而,通过模拟浏览器行为或使用淘宝开放平台提供的API(如果有的话)&#xff0c…

借助剪映软件生成原创视频(真人人声,免VIP)

civilpy:借助各大模型的优点生成原创视频(真人人声)Plus0 赞同 0 评论文章​编辑 是的,剪映也出了声音克隆了,只需要十几秒的录音就可以克隆自己的声音,虽然微瑕,但是对于不习惯机器音的很多创…

【面试】Elasticsearch 在部署时,对 Linux 的设置有哪些优化方法?

Elasticsearch 在部署时,对 Linux 的设置有哪些优化方法? Elasticsearch是一个分布式搜索和分析引擎,它在Linux环境下的性能和稳定性可以通过一些优化方法进行提升。以下是一些针对Linux环境下Elasticsearch部署的优化方法: 1. 内…

职场人必备!效率翻倍的多微信号必备管理工具大揭秘

在职场中,高效率的工作方式是非常重要的。而为了提高工作效率,合理运用一些工作神器也是必不可少的。今天给大家分享一个多微信号管理工具——微信管理系统,它能够帮助职场人员管理多个微信号,让工作变得更加高效。 首先&#xf…

嵌入式开发——基础元器件

目录 1. 电阻 2. 电容 3. 电感 4. 二极管 5. 三极管 6. MOS管 7. 晶振 8. 磁珠 9. LDO 10. 电源 11. 接地 12. 线路 13. 电压表 14. 电流表 1. 电阻 根据欧姆定理,UI*R,通过某段导体的电流跟这段导体两端的电压成正比,跟这段导…

教你六个步骤完成本地知识库搭建

用通俗易懂的语言说,本地知识库就是一个放在公司电脑或服务器上的知识大宝库。这个宝库里可以放入各种知识,比如公司的规章制度、产品介绍、销售技巧、市场分析报告等等,只要是公司里觉得有用的知识,都可以放进去。 有了它&#x…

如何本地部署Elasticsearch+cpolar实现公网查询与管理内网数据

文章目录 系统环境1. Windows 安装Elasticsearch2. 本地访问Elasticsearch3. Windows 安装 Cpolar4. 创建Elasticsearch公网访问地址5. 远程访问Elasticsearch6. 设置固定二级子域名 正文开始前给大家推荐个网站,前些天发现了一个巨牛的 人工智能学习网站&#xff…