【MySQL】表的约束(2)

news2025/1/12 1:07:48

【MySQL】表的约束(2)

目录

  • 【MySQL】表的约束(2)
    • 自增长
    • 唯一键
    • 外键
    • 综合案例-阅读

作者:爱写代码的刚子

时间:2024.3.13

前言:本篇博客主要是介绍表的约束下部分内容(自增长,唯一键,外键)

自增长

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

自增长的特点:

  • 任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)

  • 自增长字段必须是整数

  • 一张表最多只能有一个自增长

  • 创建一个自增长的表

在这里插入图片描述

  • 向表中插入数据并查看:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

默认从1开始自增

  • 但是如果插入了id值较大的数据,那将会从原始id的最大值开始增长:

在这里插入图片描述

在这里插入图片描述

  • 如何做到?

在这里插入图片描述

除了表内有AUTO_INCREMENT,表外也有AUTO_INCREMENT(用来表示下一次数据插入时的AUTO_INCREMENT起始值)

  • 注意设为自增长的那一列必须为主键

  • **select last_insert_id();**在插入后获取上次插入的 AUTO_INCREMENT 的值(批量插入获取的是第一个值)

索引(本质就是牺牲空间换时间):

在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。

索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。 数据库使用索引以找到特定值,然后顺指针找到包含该值的行。这样可以使对应于表的SQL语句执行得 更快,可快速访问数据库表中的特定信息。

唯一键

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

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

  • 创建含有唯一键的表:

在这里插入图片描述

  • 插入数据:

在这里插入图片描述

唯一键可以为空,但是主键不能为空

关于唯一键和主键的区别:
我们可以简单理解成,主键更多的是标识唯一性的。而唯一键更多的是保证在业务上,不要和别的信息出现重复。(并不冲突,反而互相补充)

  • 让唯一键也不为空:

在这里插入图片描述

在这里插入图片描述

外键

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

在这里插入图片描述

  • 外键:1. 从表和主表的关联关系2. 产生外键约束
  • 创建两张表:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 往student表中插入一些学生:

在这里插入图片描述

  • 这时我们插入了一个班级之外的学生(理论上这是不被允许的):

在这里插入图片描述

所以mysql要规避这种不符合要求的插入。

  • 同时删除班级也是不合理的

在这里插入图片描述

  • 再次查看这两张表结构:

在这里插入图片描述

class_id有外键之名(关联关系),但是没有外键之实(没有约束

  • 创建一个带有外键的从表student:

在这里插入图片描述

  • 当前的class表:

在这里插入图片描述

在这里插入图片描述

  • 从表内依旧有student关联,所以不能删除class里面的id:

在这里插入图片描述

  • 当关联的class_id没有数据时可以删除主表相关的id字段:

在这里插入图片描述

在这里插入图片描述

外键保证完整性:有学生对应班级,有班级对应学生,不会将学生插入一个不存在的班级,也不会删除一个还有学生的班级,保证了表与表之间的完整性

首先我们承认,这个世界是数据很多都是相关性的。
理论上,上面的例子,我们不创建外键约束,就正常建立学生表,以及班级表,该有的字段我们都有。

此时,在实际使用的时候,可能会出现什么问题? 有没有可能插入的学生信息中有具体的班级,但是该班级却没有在班级表中? 比如比特只开了比特100班,比特101班,但是在上课的学生里面竟然有比特102班的学生(这个班目前并 不存在),这很明显是有问题的。

因为此时两张表在业务上是有相关性的,但是在业务上没有建立约束关系,那么就可能出现问题。

解决方案就是通过外键完成的。建立外键的本质其实就是把相关性交给mysql去审核了,提前告诉mysql 表之间的约束关系,那么当用户插入不符合业务逻辑的数据的时候,mysql不允许你插入。

  • 可以对外键起别名:

在这里插入图片描述

综合案例-阅读

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

  • 商品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)

要求:

  • 每个表的主外键
  • 客户的姓名不能为空值
  • 邮箱不能重复
  • 客户的性别(男,女)

SQL:

-- 创建数据库
create database if not exists bit32mall default character set utf8 ;
-- 选择数据库 use bit32mall;
-- 创建数据库表
-- 商品
create table if not exists goods (
  goods_id int primary key auto_increment comment '商品编号', 					goods_name varchar(32) not null comment '商品名称', 
  unitprice int not null default 0 comment '单价,单位分', 
  category varchar(12) comment '商品分类',
  provider varchar(64) not null comment '供应商名称' 
);
-- 客户
create table if not exists customer (
  customer_id int primary key auto_increment comment '客户编号', name 	varchar(32) not null comment '客户姓名',
  address varchar(256) comment '客户地址',
  email varchar(64) unique key comment '电子邮箱',
  sex enum('男','女') not null comment '性别',
  card_id char(18) unique key comment '身份证' 
);
-- 购买
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 0 comment '购买数量',
    foreign key (customer_id) references customer(customer_id),
    foreign key (goods_id) references goods(goods_id)
);

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

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

相关文章

计算机考研|怎么备考「科软」?

学好408和考研数学就可以了 大家对于科软已经回到了理性的区间,很难再出现刚开始的300分上科软的现象,也不会再出现388分炸穿地心的现象。 如果大家想报考科软,我觉得一定要认真对待复习,不要抱有抄底的心态去复习。 众所周知&am…

QtCreate cmake 和qmake 使用调用动态库流程

链接: QtCreate cmake 和qmake 使用调用静态库流程-CSDN博客 重点: 1.流程和静态库一样。 2.只是在include下放置所需的dll。 3.cmakelist.txt中的文件路径并未变化。

Selenium抓取youtube视频推荐

Youtube作为一个全球最大的视频资源平台,对于视频资源有很好的规整处理。所以当我们想要抓取一些视频资源时,它本身提供的API能力不符合时,我们需要使用Selenium去抓取视频。 以下是根据一条视频链接去抓取推荐列表的功能: asyn…

不锈钢多功能电工剥线钳分线绕线剪线剥线钳剥线压线扒皮钳子

品牌:银隆 型号:089B绿色 材质:镍铬钢(不锈钢) 颜色分类:089B灰色,089B红色,089B绿色,089B黑色,089B橙色 功能齐集一身,一钳多用,多功能剥线钳。剥线,剪线&#xff…

前端三件套 | 综合练习:模拟抽奖活动,实现一个简单的随机抽取并显示三名获胜者

随机运行结果如下&#xff1a; 参考代码如下&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><tit…

分数相加减(C语言)

一、流程图&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int fenmu 2;int result 1;int fuhao 1;//执行循环&#xff1b;while (fenmu < 100){//运算&#xff1b;fuhao (-1…

深度学习1650ti在win10安装pytorch复盘

深度学习1650ti在win10安装pytorch复盘 前言1. 安装anaconda2. 检查更新显卡驱动3. 根据pytorch选择CUDA版本4. 安装CUDA5. 安装cuDNN6. conda安装pytorch结语 前言 建议有条件的&#xff0c;可以在安装过程中&#xff0c;开启梯子。例如cuDNN安装时登录 or 注册&#xff0c;会…

Redis应用与原理(一)

更好的阅读体验 \huge{\color{red}{更好的阅读体验}} 更好的阅读体验 缓存发展史 缓存经典场景 在没有引入缓存前&#xff0c;为了应对大量流量&#xff0c;一般采用&#xff1a; LVS 代理Nginx 做负载均衡搭建 Tomcat 集群 这种方式下&#xff0c;随着访问量的增大&#xf…

Python 蜂窝六边形分析

在本文中,我们将使用 Wildland Fire Interagency Geospatial Services (WFIGS) 2022 数据集,并仅关注新墨西哥州的 Hermits Peak / Calf Canyon 火灾。这场野火是该州历史上规模最大的野火,烧毁面积超过 30 万英亩。大火位于陶斯和圣达菲之间,烧毁了桑格雷德克里斯托山脉的…

继承 ResponseEntityExceptionHandler

目录 作用概述 示例-HttpRequestMethodNotSupportedException 示例-自定义异常处理 总示例 使用了ResponseEntityExceptionHandler后&#xff0c;为什么发生了异常后返回体为空 方法执行顺序 作用概述 这是一个方便的基类&#xff0c;用于希望通过 ExceptionHandler 方法…

centos7修改ssh登录错误限制和端口修改

前几天登录服务器的时候发现有错误登录信息15w多条&#xff0c;该服务器映射了外网&#xff0c;估计是被爆破了。为了防止再有人进行爆破&#xff0c;修改一下ssh的限制登录顺便把默认端口改掉 编辑ssh配置文件 vim /etc/ssh/sshd_config去掉注释 按需修改次数 MaxAuthTries 6…

云服务器2核4G5M配置代表什么意思?

腾讯云服务器2核4G5M带宽配置是代表什么&#xff1f;代表2核CPU、4G内存、5M公网带宽&#xff0c;这是一款轻量应用服务器&#xff0c;系统盘为60GB SSD云硬盘&#xff0c;活动页面 txybk.com/go/txy 活动打开如下图&#xff1a; 腾讯云2核4G5M服务器 如上图所示&#xff0c;这…

EDA事件驱动架构/BASE理论/幂等性理论

EDA事件驱动架构&#xff1a;Event Driven Architecture 消息组件&#xff1a;不仅仅是削峰填谷 而且可以做事件驱动架构 EDA驱动的特定&#xff1a;异步处理、跨平台/语言通信、应用解耦、可靠投递、最终一致性 BASE理论&#xff1a; 基本可用 Basically Available 软状态 …

JavaScript做一个贪吃蛇小游戏,无需网络直接玩。

用JavaScript做一个贪吃蛇小游戏&#xff0c;无需网络 > 打开即可玩。 html代码&#xff1a; <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><title>Title</title><style>#game{width: 344p…

json-server库的使用,实现数据模拟

项目目录 安装 npm i -g json-server0.17.4 启动单个json服务&#xff0c;在cookbook目录下执行命令&#xff1a; json-server ./mock/a.json -p 9000 待实现 使用0.17.4版本即可。

BIG-Bench Hard 数据集分享

来源: AINLPer公众号&#xff08;每日干货分享&#xff01;&#xff01;&#xff09; 编辑: ShuYini 校稿: ShuYini 时间: 2024-3-17 该数据集由Google、斯坦福等研究人员开发&#xff0c;BBH的全称是BIG-Bench Hard&#xff0c;它是BIG-Bench数据集的一个子集&#xff0c;它专…

前端工程化(二)(精品、面试必备基础)(春招、秋招)

目录 什么是模块化?CommonJS规范和Node关系模块化的核心exports 导出 & require 导入模块加载(持续更新) 什么是模块化? 事实上模块化开发最终的目的是将程序划分成一个个小的结构&#xff1b; 这个结构中编写属于自己的逻辑代码&#xff0c;有自己的作用域&#xff0c;…

代码随想录(day6)——哈希表

Leetcode.242 有效的字母异位词&#xff1a; 242. 有效的字母异位词 - 力扣&#xff08;LeetCode&#xff09; 原理简单&#xff0c;首先判断给定的两个字符串的长度是否相等&#xff0c;如果不相等则直接返回&#xff0c;只有在给定字符串长度想的的情况下才进行下一步的判断…

(三)OpenOFDM符号对齐

符号对齐 模块&#xff1a;sync_long.v输入&#xff1a;I (16), Q (16), phase_offset (32), short_gi (1)输出&#xff1a;long_preamble_detected (1), fft_re (16), fft_im (16) 检测到数据包后&#xff0c;下一步是精确确定每个 OFDM 符号的起始位置。在802.11中&#xf…

4-如何进行细分市场分析-03 竞争者分析

任何一个行业肯定都是有很多竞争者&#xff0c;我们如何判断这些竞争者对我们有什么样的威胁、什么样的机会、什么样的影响&#xff0c;我们需要去分析这些竞争者。 行业竞争格局如何分析&#xff1f; 我们可以从一些基本指标来入手&#xff0c;如市场集中度、行业利润率。 竞…