【MySQL 05】表的约束

news2024/10/1 9:49:13

目录

1.约束的概念

 2 空属性约束

 3.默认值约束

4. 列描述(comment)

 5.补零(zerofill)

6.主键约束 (primary key)

基本案例

主键的删除与添加

复合主键

复合主键的删除与添加

7. 自增长约束(auto_increment)

基本案例

建表时设置起始值

last_insert_id()

8.唯一键 (unique)

 9.外键约束


1.约束的概念

        MySQL表中的约束(Constraints)是强加于表上的规则,用于限制存储在表中的数据类型,并确保数据的准确性和可靠性。这些约束有助于维护数据的完整性,防止无效数据的插入或更新。

        比如有的数据是必填项,就像身份认证的时候,或者填注册信息的时候,手机号身份证这种就不能空着,所以就有了非空约束;又有的数据比如用户的唯一id,不能跟其他人的一样,所以就需要使用唯一约束等等。

 2 空属性约束

  • 两个值:null(默认的)和not null(不为空)
  • 数据库默认字段基本都是字段为空,但是实际开发时,尽可能保证字段不为空,因为数据为空没办法参与运算

案例:

        创建一个班级表,包含班级名和班级所在的教室。
站在正常的业务逻辑中:

  • 如果班级没有名字,你不知道你在哪个班级
  • 如果教室名字可以为空,就不知道在哪上课

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

两个字段都不能为空,否则插入失败

 3.默认值约束

        默认值:某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户可以选择性的使用默,使用关键字default

案例

        我们创建了t8表,其中age和name都给了默认值,我们进行填充具体的数据就是填充的数据,不填充就给默认的值。

同时给not null和 default

        这样会不会冲突呢,not null 表示不为空,如果设置了default该字段本就不为空了,但该字段不能手动给NULL的数据,如果只有default那么该字段是允许给NULL的。

4. 列描述(comment)

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

案例

        当创建表,不知道对应字段的含义时,就可以查看建表命令,查看对应comment对字段的表述信息。

 5.补零(zerofill)

  1. 显示宽度:当你指定 ZEROFILL 时,通常需要同时指定列的显示宽度(例如 INT(5) ZEROFILL)。但是,需要注意的是,这个显示宽度并不限制值的范围,它只影响值的显示方式。

  2. 自动填充零:如果列的值在转换为字符串以进行显示时长度小于指定的显示宽度,MySQL 会在其前面填充零直到达到指定的宽度,超过宽度就不会补0.

  3. 正数和负数:对于负数,ZEROFILL 不会自动填充零。因为负号(-)会占用一个字符位置,所以实际的数字部分会相应地向右移动,且不会进行零填充。

  4. 默认值:如果列有默认值且未指定 ZEROFILL,则在添加 ZEROFILL 后,可能需要重新考虑默认值的设置,以确保它符合预期的显示格式。

  5. 字符类型不适用ZEROFILL 仅适用于数字类型(INTBIGINTDECIMALNUMERIC),不适用于字符类型(如 VARCHARCHAR)。

假设我们有一个表 employees,其中有一个列 id 被定义为 INT(5) ZEROFILL

如果我们向表中插入一些值:

id 被相应地用零填充以达到指定的宽度。

6.主键约束 (primary key)

        主键是表中的一列或多列的组合,用于唯一标识表中的每一行。换句话说,主键列的值必须是唯一的,不能重复,并且表中的每一行都必须有一个主键值(尽管这个值可以是NULL,但在实际使用中,通常不会将主键设置为允许NULL,因为这样会失去主键的唯一性意义)。

        

主键约束是作用于主键列或列组合上的一种约束,它自动地实施了两个关键的规则:

  1. 唯一性(Unique):确保表中所有行的主键值都是唯一的。不允许有两行具有相同的主键值。
  2. 非空(Not NULL):主键列不允许包含NULL值。这是因为如果主键可以包含NULL,那么它就可能无法唯一地标识表中的每一行。

基本案例

主键不可重复

我们还可以根据主键去对数据进行增删查改

主键的删除与添加

        删除一张表的主键,因为主键唯一,指的时删除主键约束(而不是删除列本身)

        添加主键,本质就是重新加上主键约束,但要保证主键列不可以有重复的数据且数据不为空,否则不能添加成主键

复合主键

        一张表中只有一个主键,但主键是可以给多列的——复合主键。

        复合主键是数据库表设计中的一个重要概念,它指的是由两个或多个字段(列)共同组成的主键,用于唯一标识数据库表中的每一条记录。

基本案例

        我们将学生的id和课程代码为复合主键,这有什么效果呢?

         学号为1的同学可以选择E1课程,当然也可以选择E2课程,但是1号同学选了E1课程,就不能再次选择了。也就是说复合主键,只要其中一个列和历史数据不一样的话,都是可以的,但不能两个都和历史数据相同。

复合主键的删除与添加

        直接删除主键约束即可

        添加主键约束,确保所有主键列每行不能同时出现重复数据且保证数据不为空即可

7. 自增长约束(auto_increment)

        自增长(Auto-Increment)约束是一个特性,用于在插入新记录时自动生成唯一的数字,这个数字通常是递增的。它主要用于主键列,以确保每条记录都有一个唯一的标识符。当表中添加新记录而该记录的自增长列未明确指定值时,MySQL会自动为该列赋予一个比当前最大值大1的值(如果该表为空,则通常从1开始)。

        在创建表时,可以通过在列定义后添加AUTO_INCREMENT属性来添加自增长约束。这个属性通常与PRIMARY KEY约束一起使用,因为主键列的值必须是唯一的。

  • 任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)
  • 自增长字段必须是整数
  • 一张表最多只能有一个自增长

基本案例

        与主键搭配使用

        只插入name列,id列自增

        你也可以对id进行手动插入,只不过,之后如果插入会从此刻id后自增长,要保证不能插入重复的id

建表时设置起始值

        起始如果不设置起始值,auto_increment默认等于1,如果在中间手动插入id,其实就是将auto_increment的值进行了修改。

last_insert_id()

  last_insert_id() 是一个在多种数据库系统中都存在的函数或方法,但特别在 MySQL 和一些兼容的数据库(如 MariaDB)中广泛使用。这个函数的主要作用是返回最近一次使用 AUTO_INCREMENT 属性插入到表中的行的 ID 值

8.唯一键 (unique)

        一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键:唯一键就可以解决表中有多个字段需要唯一性约束的问题。

        唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。

关于唯一键和主键的区别:
        我们可以简单理解成,主键更多的是标识唯一性的。而唯一键更多的是保证在业务上,不要和别的信息出现重复。乍一听好像没啥区别,我们举一个例子

假设一个场景(当然,具体可能并不是这样,仅仅为了帮助大家理解)
比如在公司,我们需要一个员工管理系统,系统中有一个员工表,员工表中有两列信息,
一个身份证号码,一个是员工工号,我们可以选择身份号码作为主键。

而我们设计员工工号的时候,需要一种约束:而所有的员工工号都不能重复。

具体指的是在公司的业务上不能重复,我们设计表的时候,需要这个约束,
那么就可以将员工工号设计成为唯一键。

一般而言,我们建议将主键设计成为和当前业务无关的字段,这样,当业务调整的时候,
我们可以尽量不会对主键做过大的调整。

        也就是说,一个人身上有多个属性,很多属性也都是具有唯一性的,需要做唯一键的约束,而主键,就是从众多的唯一性中选出来作为主键的,主键和唯一键不冲突,而是互为补充的。

基本案例

        我们将id设置为主键,学号为唯一键

        由于02学号已被占用,学号被设置唯一键,不可以存在重复的值,因此再次插入02失败。

        被设置唯一键的字段是允许为空的,且设置为空字段不做唯一性比较

 9.外键约束

        外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。

语法:

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

        学生表依附于班级表,所以我们将学生表称之为从表,班级表我们称之为主表。class_id这一列是用于与另一个表产生关联关系的,所以我们称class_id为外键

案例

        创建一个学生表(从表),class_id字段已被设置成外键

        创建一个班级表

        给class表插入数据

        给student插入数据,我们选择课程id为1,2的时候,是可以插入成功的,插入其它id号,就会发生外键约束,MySQL拦截此操作

        对class表中id为1进行删除,此时是不能删除的,因为从表中外键还存在此id

        如果我们把从表中外键为1的行删除,再做上面操作,就是被允许的

外键:1.是从表和主表的关联关系 2. 产生外键约束

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue3【实战】响应式主题(实时获取页面比例,指定尺寸内按比例缩放,超过指定尺寸保持高度不变的图片)

实时获取页面比例 移动端设计稿通常为 750px当前窗口的宽为 window.innerWidth通过 useResizeObserver 可实时监听窗口大小的变化 src/stores/theme.ts export const useThemeStroe defineStore(theme, () > {const rate ref(0)function setRate(newRate: number) {rate…

系统分析师13:软件工程

文章目录 1 内容概要2 信息系统的生命周期2.1 单个系统开发周期 3 软件开发方法4 软件开发模型4.1 概述4.2 其他经典模型4.3 瀑布模型4.4 V模型4.5 喷泉模型4.6 W模型4.7 迭代与增量4.8 增量模型与螺旋模型4.9 构建组装模型4.10 快速应用开发模型(RAD)4.…

SQL Server的关系代数(选择投影连接除)

目录 1.博客素材来源 2.传统的关系运算 3.专门的关系运算 3.1选择: 3.2投影: 3.3自然连接: 3.4等值链接: 3.5自然连接: 3.6除法: 1.博客素材来源 这个是某个大学老师在新冠时候的这个线上课程&am…

Redisson分布式锁的概念和使用

Redisson分布式锁的概念和使用 一 简介1.1 什么是分布式锁?1.2 Redisson分布式锁的原理1.3 Redisson分布式锁的优势1.4 Redisson分布式锁的应用场景 二 案例2.1 锁竞争案例2.2 看门狗案例2.3 参考文章 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff…

maven报错:Unresolved plugin ‘org.apache.maven.pluginsmaven-resources-plugin‘

maven报错:Unresolved plugin: ‘org.apache.maven.plugins:maven-resources-plugin‘ 最近初学java,这里记录一下报错出现的原因以及解决办法 问题示例 如图所示,就是在创建一个项目之后对应插件的部分有爆红 问题出现的原因 简单来说就…

Pygame中Sprite实现逃亡游戏3

在《Pygame中Sprite实现逃亡游戏2》中实现了飞龙和飞火的显示。接下来实现玩家跳跃效果,如图1所示。 图1 玩家跳跃效果 1 按键响应 当玩家按下键盘中空格按键后,游戏中的玩家就会跳跃,用于躲避飞火。在while True循环判断按键的代码中&…

开放原子开源基金会网站上的开源项目EasyBaaS存在内存泄露缺陷

今天我仍然发布一个开放原子开源基金会网站上的开源项目EasyBaaS,这个开源项目的捐赠主体是招商银行股份有限公司。该项目的是一个基于Linux环境的区块链节点管理工具,提供一键部署节点、实时监控及管理运维等功能,从搭建节点、启停节点、节点…

Python | Leetcode Python题解之第436题寻找右区间

题目: 题解: class Solution:def findRightInterval(self, intervals: List[List[int]]) -> List[int]:n len(intervals)starts, ends list(zip(*intervals))starts sorted(zip(starts, range(n)))ends sorted(zip(ends, range(n)))ans, j [-1]…

Qt网络编程——QTcpServer和QTcpSocket

文章目录 核心APITCP回显服务器TCP回显客户端 核心API QTcpServer用于监听端口和获取客户端连接 名称类型说明对标原生APIlisten(const QHostAddress&, quint16 port)方法绑定指定的地址和端口号,并开始监听bind和listennextPendingConnection()方法从系统中获…

【2024/9/25更新】最新版植物大战僵尸V2.5.1发布啦

下载链接⬇️⬇️ 最新版V2.5.1下载 点击下载 历史版本下载 点击下载 更新公告 2.5.1版本更新公告: 关卡阅整 两面夹击关卡系列关卡降低出怪倍率 两面夹击关卡出怪种类调整 两面夹击部分关卡初始阳光调整 两面夹击关卡中可使用投手类植物- 两面夹击关卡中的脑子血量…

远程升级频频失败?原因竟然是…

最近有客户反馈在乡村里频繁出现掉线的情况。 赶紧排查原因! 通过换货、换SIM卡对比排查测试,发现只有去年采购的那批模块在客户环境附近会出现掉线的情况,而今年采购的模块批次就不会掉线。。。 继续追究原因,联系对应的销售工…

基于springboot vue 大学生竞赛管理系统设计与实现

博主介绍:专注于Java vue .net php phython 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟 我的博客空间发布了1000毕设题目 方便大家学习使用 感兴趣的…

路径报错问题

项目场景: 假设这是我的项目结构,我现在需要在aa.js文件中引入并使用aa.geojson文件, 问题: 当我引入路径是const filePath ../geo/aa.geojson;的时候,系统报错 "aa.geojson is not Found",找不…

【WRF数据介绍第二期】气象驱动场数据介绍及下载

WRF数据介绍第二期:气象驱动场数据介绍及下载 WRF官网-Free Data数据下载 EAR5数据数据下载 参考 WRF运行流程如下,所需的外部数据源包括静态地理数据(Static Geography Data)和网格气象数据(Gridded Meteorological D…

基于AI网关的智慧煤矿安全监测应用

煤矿安全一直是矿业管理的重中之重。由于煤矿环境的恶劣与复杂性,例如工作中间环节多、设施设备多样且集中、空间狭小、环境闭塞、有害气体隐患、粉尘聚集等,针对煤矿的安全监测和防范时常面临着极大的挑战。 随着AI技术的发展与普及,依托AI实…

关于前端框架的对比和选择

成长路上不孤单😊😊😊😊😊😊 【14后😊///C爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于【前端框架的对比和选择】相关内容&…

力扣 中等 275.H指数

文章目录 题目介绍题解 题目介绍 题解 h指数不一定都满足citations[mid] n - mid,例如[0,1,4,5,6]的h指数是3。 题目说了用对数时间复杂度来实现,说明一定是用二分法,草纸上推导一下即可得出以下代码。 class Solution {public int hInde…

MySQL自动测试框架Test Framework工具实践

导读 之前的文章(《MySQL自动测试框架Test Framework浅析》)从源码级别对MySQL自动测试框架Test Framework进行了简要分析,本文接下来从实践的角度介绍Test Framework工具的使用方法。 1 简介 Test Framework主要应用于MySQL等相关数据库项…

Docker 容器技术:颠覆传统,重塑软件世界的新势力

一、Docker简介 什么是docker Docker 是一种开源的容器化平台,它可以让开发者将应用程序及其所有的依赖项打包成一个标准化的容器,从而实现快速部署、可移植性和一致性。 从功能角度来看,Docker 主要有以下几个重要特点: 轻量…

用Python实现运筹学——Day 3: 线性规划模型构建

一、学习内容 线性规划模型构建的步骤与技巧 线性规划(Linear Programming, LP)模型构建是运筹学中的核心内容,通常用于求解资源的最优分配问题。要从实际问题中提取出一个线性规划模型,需要按照以下步骤进行: 问题描…