[MySQL]MySQL表的约束

[MySQL]表的约束

文章目录

  • [MySQL]表的约束
    • 1. 约束的概念
    • 2. 空属性(null/not null)
    • 3. 默认值(default)
    • 4. 列描述(comment)
    • 5. 填充零(zerofill)
    • 6. 主键(primary key)
    • 7. 自增长(auto_increment)
    • 8. 唯一键(unique)
    • 9. 外键(foreign key)

1. 约束的概念

数据库通过技术手段限制数据的插入,使得插入的数据一定是符合规则的。

  • 约束是在创建表的时候定义的。

**从程序员角度,**约束使得程序员必须得往数据库中插入符合条件的数据。

**从数据库角度,**凡是插入进来的数据都是符合预期的。

其实数据类型就是一种约束,举个例子,将属性列的属性设定成无符号tinyint类型,能够插入该列的数据一定是在-128~127的这个范围内的。

image-20230708190717641

约束的最终目标:保证数据的完整性和可预期性。

2. 空属性(null/not null)

数据库中null的含义是没有数据。not null的含义是不能没有数据。

  • 没有显示定义时,默认的约束是属性列可以为空(null)。

  • 可以显示定义属性列的数据不能为空(not null)。

  • 数据库默认字段基本都是字段为空,但是实际开发时,尽可能保证字段不为空,因为数据为空没办法参与运算。

空属性约束示例:

案例:

创建一个班级表,包含班级名和班级所在的教室。

站在正常的业务逻辑中:

如果班级没有名字,你不知道你在哪个班级 。

如果教室名字可以为空,就不知道在哪上课。

image-20230708193143915

image-20230708193844762

3. 默认值(default)

默认值是某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候, 用户可以选择性的使用默认值。默认值的使用类似于编程语言中的缺省值。

  • 默认值的生效:数据在插入的时候不给该字段赋值,就使用默认值。
  • 数据在插入的时候不给该字段赋值,并且表定义时没给默认值,无法直接插入。
  • 设定默认值不代表数据不可能为空,用户可能指定插入空值。
  • 系统默认的默认值为null。
  • 设定not null就没有系统默认值。

默认值约束示例:

image-20230708203225385

image-20230708203455760

image-20230708204641945

image-20230708205637391

非空属性和默认值的关系:

非空属性和默认值是相互补充的,非空属性约束的是用户不能插入空值,默认值约束的是用户忽略该列时插入什么数据(没设置会报错)。

4. 列描述(comment)

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

  • 列描述是给程序员看的。
  • 列描述不是硬性的约束,不会实际限制插入的数据。

列属性示例:

image-20230708211344903

5. 填充零(zerofill)

填充零约束的作用是如果宽度小于设定的宽度,自动填充0。

  • zerofill的约束对象为数值类型。

  • zerofill只是对数据显示做了约束,不影响数据的存储。

zerofill示例:

image-20230708212849669

image-20230708213030059

image-20230708213859222

image-20230708214222387

image-20230708214929912

6. 主键(primary key)

主键用来唯一的约束该字段里面的数据。主键所在的列通常是整数类型。

主键的作用是唯一确定表中的一条记录,就像使用身份证号这一属性就能确定姓名、性别、年龄等属性。

  • 主键不能为空。
  • 主键不能重复。
  • 一张表中最多只能有一个主键。
  • 可以在创建表时加主键约束,也可以在创建表后加主键约束。
  • 给表加主键约束最好在表使用前加主键约束。

主键约束示例:

image-20230709132849766

image-20230709133046888

image-20230709133351234

image-20230709133600833

image-20230709134041870

image-20230709134223193

复合主键:将表中的多个属性设为主键。

  • 复合主键是将多个属性组成的整体称为主键。

  • 复合主键中的属性只要有一个不是重复的,就不产生冲突。

复合主键约束示例:

image-20230709135204494

image-20230709135458288

7. 自增长(auto_increment)

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

  • 任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)。
  • 自增长字段必须是整数 。
  • 张表最多只能有一个自增长。
  • last_insert_id()函数(select last_insert_id())可以查看上次插入的 AUTO_INCREMENT 的值。
  • 自增长的默认初始值为1,也可以自行设置。

索引:

在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结 构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。 索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。 索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。 数据库使用索引以找到特定值,然后顺指针找到包含该值的行。这样可以使对应于表的SQL语句执行得 更快,可快速访问数据库表中的特定信息。

自增长约束示例 :

image-20230709143111145

image-20230709143317721

image-20230709144727284

image-20230709145023757

image-20230709150638430

8. 唯一键(unique)

唯一键用于解决表中有多个字段需要唯一性约束的问题。

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

**主键和唯一键的区别:**主键的作用是确定表中唯一一条记录,如果主键不是唯一的,通过主键就会查找到多个记录,因此主键必须唯一,如果主键为空,空和空无法比较,有多个空主键也就会无法确定唯一一条记录,因此主键不能为空。唯一键的作用是让某些属性在表中不重复,是为了满足某些数据需要唯一的要求,因此唯一键属性可以为空,因为没有实质数据做比较。实际上,主键只是在众多唯一键中选择出来的,然后加上了非空的限定,因为唯一键的属性非空就可以满足确定唯一一条记录的要求。举个例子,每个人有身份证号、姓名、年龄、电话号码(假设每个人一个电话号)等属性,每个人的身份证号是唯一的,电话号码是唯一的,使用表记录时身份证号、电话号码是不可以重复的,因为这是错误的记录,需要设置成唯一键,在此选中身份证号、电话号为主键都可以,因为如果它们非空的话都通过它们任一一个属性都能唯一确定一条记录,只不过我们一般选择身份证号为主键而已。

唯一键约束示例:

image-20230709155503086

image-20230709155936843

image-20230709160410473

9. 外键(foreign key)

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

  • 从表外键数据来源于主表的键。
  • 删除主表中某一个键所在的记录,需要从表中没有该键做的外键。
  • 外键使得表之间产生联系。
  • 外键使得表互相约束。

为了更好的了解外键在表与表之间的作用,我们看下面的案例:

有以下两个表用于统计信息,一个是学生信息表包含学号、姓名、所在班级号的属性,另一个是班级表包含班级号、班级名的属性,

一个学生属于一个班级。

image-20230709171303860

这样的两个表可能会出现两种问题,学校表中所在班级是不存在的:

image-20230709171523632

还有一种问题是,某个班级别去掉了,但是学生记录的班级是被去掉的班级:

image-20230709171924979

没有外键的情况下,这两个表只是逻辑上有联系,实际上在数据库没有联系。

有了外键约束就能解决上面的问题,让学生表作为从表,班级表作为主表,学生表中的class_id作为外键数据来源于班级表的id:

image-20230709173550340

设置这样的外键后,学生表中插入的记录中班级号一定来自于班级表,就不会出现学生所在班级不存在,删除班级表中的班级只能在学生表中没有学生在对应班级的情况下删除。两个表真正产生了联系,并且两个表相互约束。

外键约束示例:

image-20230709173745135

image-20230709191008136

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ADS笔记,新旧两组仿真数据进行绘图和列表对比

做个笔记,以防遗忘 ADS版本:2023 原理图器件参数的不同,怎么进行对比观看,操作如下 目录 一、数据绘图对比二、数据列表对比 一、数据绘图对比 选择Simulation Setting 然后修改原理图器件的参数,再次重复之前的操作…

MySQL自治平台建设的内核原理及实践(上)

本文整理自美团技术沙龙第75期的主题分享《美团数据库攻防演练建设实践》,系超大规模数据库集群保稳系列(内含4个议题的PPT及视频)的第4篇文章。 本文作者在演讲后根据同学们的反馈,补充了很多技术细节,跟演讲&#xf…

核磁共振常用的文件格式介绍:NIfTI volume 格式 (*.nii), GIFTI 格式 (*.gii), CIFTI 格式 (*.nii)

核磁共振常用的文件格式介绍:NIfTI volume 格式, GIFTI 格式, CIFTI 格式 NIfTI volume 格式 (*.nii)GIFTI 格式 (*.gii)CIFTI 格式 (*.nii)自定义工作台 (wb_view) 文件:Scene file文件 (*.scene)规格文件 (*.spec)Spec file (*.border)Foci (*.foci)Trajectory file (*.t…

【数据结构】栈和队列详解

⭐️ 往期相关文章 ✨链接1:数据结构和算法的概念以及时间复杂度空间复杂度详解 ✨链接2:【数据结构】手撕顺序表 ✨链接3:【数据结构】手撕单链表 ✨链接4:【数据结构】双向带头循环链表 ⭐️ 栈和队列 🌠 栈 栈是…

【计算机视觉 | 图像分割】arxiv 计算机视觉关于图像分割的学术速递(7 月 6 日论文合集)

文章目录 一、分割|语义相关(15篇)1.1 Prompting Diffusion Representations for Cross-Domain Semantic Segmentation1.2 ZJU ReLER Submission for EPIC-KITCHEN Challenge 2023: Semi-Supervised Video Object Segmentation1.3 Multi-Modal Prototypes for Open-Set Semanti…

Kafka学习笔记(基础篇)

目录 Kafka简介 消息队列 Kafka的应用场景 消息队列的两种模型 Kafka集群搭建 Kafka的生产者/消费者/工具 Kafka的基准测试工具 Kafka Java API开发 生产者程序开发 消费者程序开发 生产者使用异步方式生产消息 Kafka中的重要概念 消费者组 幂等性 事务编程 Ka…

故障:启动修复无法修复你的电脑

有台笔记本很久没用了无法开机了,还是用的win7的系统,开机后提示我使用启动修复,但是失败了,提示我启动修复无法修复你的电脑 启动修复无法修复你电脑怎么办_自动修复电脑未正确启动的解决方法-win7之家 1、上网查了下…

图形学 | 期末复习(下)| games101笔记 | 补档

博客基于GAMES101-现代计算机图形学入门-闫令琪,但不是其完整笔记,基于复习要求有一定的删减。考试以图形学入门基本概念和核心研究内容为主,少量公式。即以论述概念为主,涉及少量算法。p13:3:12是对应的games101视频节点。 文章目…

解决printJS打印问题汇总

目录 一、打印预览表格列不全(Element的el-table组件) 1、打印设置“打印缩放” 2、修改el——table的底层代码(如果页面上有多个表格慎用) 一、打印预览表格列不全(Element的el-table组件) 问题描述&a…

zookeeper第一课-Zookeeper特性与节点数据类型详解

1、Zookeeper特性与节点数据类型详解 ZooKeeper 是一个开源的分布式协调框架,是Apache Hadoop 的一个子项目,主要用来解决分布式集群中应用系统的一致性问题。 Zookeeper 的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一…

Ubuntu下Go语言TCP广播服务器实现

最近在学习Go语言网络编程,突然想到很久以前的用C语言写过的TCP广播聊天程序,然后就用Go尝试写了一遍,在此做个记录。 目录 1.广播结构 2.实现效果 3.源码 4.Go语言学习参考网站 1.广播结构 2.实现效果 服务器: 客户端1&…

计算机毕业论文内容参考|基于Python的入侵检测系统的设计与实现

文章目录 导文摘要前言绪论课题背景国内外现状与趋势课题内容相关技术与方法介绍系统分析系统设计系统实现系统测试总结与展望导文 计算机毕业论文内容参考|基于Python的入侵检测系统的设计与实现 摘要 本文介绍了基于Python的入侵检测系统的设计与实现。首先,简要概述了入侵…