[MySQL]MySQL表的约束

news2024/11/16 19:36:00

[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.coloradmin.cn/o/734721.html

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

相关文章

ping是什么,有什么作用?

什么是Ping Ping是一种计算机网络管理员软件实用程序,通常用于检查主机的可访问性。可访问性包括两个方面。一个是可用性,另一个是响应时间。 ping 请求可以通过大多数命令行界面中标准的 ping 命令执行。Ping是什么意思?它是一个实用程序&…

同步锁-线程安全问题解决方案

同步锁-线程安全问题解决方案 目录 同步锁-线程安全问题解决方案1 同步锁1.1 前言1.2 同步与异步1.3 synchronized同步关键字1.3.1 写法1.3.2 前提1.3.3 特点1.4.1练习-改造售票案例implements Runnable1.4.2 练习-改造售票案例extends Thread 1.5 之前遇到过的同步例子 2 线程…

IIC(硬件实现)-GD32

IIC(硬件实现)-GD32 #include "i2c.h"void i2c_init(void){i2c_deinit(I2C0);//使能外设时钟rcu_periph_clock_enable(RCU_I2C0);rcu_periph_clock_enable(RCU_GPIOB);//设置gpio口gpio_init(GPIOB, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, GPIO…

SSM项目 shiro整合redis

一、准备阶段&#x1f349; 创建好web工程后&#xff08;不会创建的可以看我前几篇文章&#xff09; 看不懂的小伙伴可以看一下我的第一篇文章里面有详细的介绍 1.引入依赖&#x1f95d; <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"ht…

数据库管理-第九十期 本周升级一小坑(20230709)

第九十期 本周升级一小坑 19c OCM依然在准备之中&#xff0c;第三堂和第四堂应该在下周内完成。 本周割接了3次&#xff0c;一次给X8M计算节点换内存&#xff08;可修复的ECC报错了&#xff0c;没影响生产&#xff09;&#xff0c;两次都是给X8那套升级&#xff08;就是多灾多…

基础IO及文件系统

一、系统接口介绍 1. open()命令 模式下&#xff1a;ctrlv进入visual block模式&#xff0c;然后选择J、K&#xff0c;然后输入大写i&#xff0c;然后输入//&#xff0c;最后按ESC&#xff0c;即可完成批量注释&#xff0c;按u取消。ctrl v 进入块选择模式&#xff0c;选中你要…

LinuxCP插件virtio与内核vhost

以下为LCP创建的接口对&#xff0c;VPP侧为物理接口port7&#xff0c;映射到Linux侧的为虚拟接口hostap1&#xff0c;接口hostap1作为vhost的后端存在。VPP侧接口tap1为前端的virtio接口。 vpp# show lcp itf-pair: [0] port7 tap1 hostap1 24 type tap vdp# vdp# show interf…

QT登录界面

1.效果图 2.代码 #include "widget.h" #include "ui_widget.h" #include <QApplication> #include <QWidget> #include <QtWidgets>Widget::Widget(QWidget *parent): QMainWindow(parent), ui(new Ui::Widget) {ui->setupUi(this);…

【数据结构二叉树OJ系列】5、相同的树和另一个树

目录 一、相同的树 二、另一个树的子树 一、相同的树 题述&#xff1a; 给定二叉树&#xff0c;检验他们是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为他们是相同的。 示例1&#xff1a; 题中已给&#xff1a; struct TreeNode {i…

黑马大数据学习笔记0-环境配置

目录 设置VMware网络CentOS操作系统三台虚拟机系统配置&#xff1a;主机名、固定IP、SSH免密登录配置主机名映射配置SSH免密登录创建hadoop用户并配置免密登录JDK1.8环境部署防火墙、SELinux、时间同步设置快照 视频p3-p5 https://www.bilibili.com/video/BV1WY4y197g7?p3 设…

tomcat第1章 tomcat介绍、安装、部署项目

一、前言 我们在写javaweb程序的时候有没有考虑如果没有tomcat&#xff0c;我们怎么给客户端返回响应数据&#xff1f;既然能返回响应数据&#xff0c;为什么还要使用tomcat&#xff1f; 什么是tomcat&#xff0c;以及tomcat历史版本发展情况&#xff0c;每个版本servlet规范…

如何与ChatGPT愉快地聊天

原文链接&#xff1a;https://mp.weixin.qq.com/s/ui-O4CnT_W51_zqW4krtcQ 人工智能的发展已经走到了一个新的阶段&#xff0c;在这个阶段&#xff0c;人工智能可以像人一样与我们进行深度的文本交互。其中&#xff0c;OpenAI的ChatGPT是一个具有代表性的模型。然而&#xff0…

JavaFX学习:MVC模式中的PropertyValueFactory

PropertyValueFactory类是“TableColumn cell value factory”,绑定创建列表中的项。示例如下&#xff1a; TableColumn<Person,String> firstNameCol new TableColumn<Person,String>("First Name");firstNameCol.setCellValueFactory(new PropertyVal…

Blender基础入门(3):复杂建模技巧

文章目录 我个人的Blender专栏前言基础属性设置选择循环选择&#xff1a;Alt左键透视选择锁定物体编辑模式123快捷键按下/&#xff08;右侧Shift左边&#xff0c;<>按键右边&#xff09;&#xff0c;锁定物体先在物体模式选择物体&#xff0c;再到编辑模式就只会选择该物…

淘宝订单拉取更新历史状态~需求

&#x1f4da;目录 订单接口api需求问题解决 Map<String,TaobaoOrder> 订单接口api 可自行查询官网文档&#xff0c;点击进入 需求 通过接口中has_next 标识判断该时间断是否还有下一页数据,直到该值数据为false时,表面该时间范围内的订单数据获取完成. 拉取完成后需要对…

Maven工程开发中的继承与聚合

1. 聚合工程概念 设置一个空的maven工程&#xff0c;工程里面只有pom文件&#xff0c;另外将这个工程的打包方式设置为pom。 在聚合工程里面添加聚合工程里面管理的模块 2.聚合总结 3.继承 例如下面02工程继承上面的01工程&#xff0c;在02工程的pom文件中要配置要继承的父工…

分组统计--Pandas

1.groupby 1.1 函数功能 先对数据进行分组&#xff0c;然后在每个分组上运用聚合函数、转换函数 1.2 函数语法 DataFrame.groupby(byNone, axis0, levelNone, as_indexTrue, sortTrue, group_keysTrue, observedFalse, dropnaTrue)1.3 函数参数 参数含义by分组依据axis沿着…

【电子学会】2023年05月图形化一级 -- 找食物

找食物 1. 准备工作 &#xff08;1&#xff09;添加背景&#xff1a;Jungle&#xff1b; &#xff08;2&#xff09;删除小猫角色&#xff0c;添加角色&#xff1a;Dog2、Donut&#xff1b; 2. 功能实现 &#xff08;1&#xff09;点击绿旗&#xff0c;小狗的初始位置在舞…

打家劫舍(力扣)动态规划 JAVA

你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给定一个代表每个房屋存放金额的非…

从C语言到C++_25(树的十道OJ题)力扣:606+102+107+236+426+105+106+144+94+145

目录 606. 根据二叉树创建字符串 - 力扣&#xff08;LeetCode&#xff09; 解析代码&#xff1a; 102. 二叉树的层序遍历 - 力扣&#xff08;LeetCode&#xff09; 解析代码&#xff1a; 107. 二叉树的层序遍历 II - 力扣&#xff08;LeetCode&#xff09; 解析代码&…