【MySQL进阶之路】表的约束——主键,自增长,唯一键,外键

目录

主键

复合主键

自增长

唯一键 unique

外键

方案一

方案二

方案三


个人主页:东洛的克莱斯韦克-CSDN博客

主键

主键primary key用来唯一的约束该字段里面的数据,不能重复,不能为空(必须有非空约束),一张表中最多只能有一个 主键;主键所在的列通常是整数类型。

实例

create table t(id int not null primary key comment '学生id',name varchar(10) not null comment '学生姓名'
);

主键约束:主键对应的字段中不能重复,一旦重复,操作失败。如下操作

insert into t values(1, '张三');
insert into t values(1, '李四');

当表创建好以后但是没有主键的时候,可以再次追加主键,追加主键的字段必须有非空约束,否则会报错。

alter table 表名 add primary key(字段列表)

删除主键

alter table 表名 drop primary key;

复合主键

在创建表的时候,在所有字段之后,使用primary key(主键字段列表)来创建主键,如果有多个字段 作为主键,可以使用复合主键。

create table tt14(
id int unsigned,
course char(10) comment '课程代码',
score tinyint unsigned default 60 comment '成绩',
primary key(id, course) -- id和course为复合主键
);

自增长

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

自增长的特点:

任何一个字段要做自增长,前提是本身是一个主键

自增长字段必须是整数

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

实例

create table t2
( 
id int primary key auto_increment,name varchar(10) not null 
);

只插入name字段的值

insert into t2(name) values('a');
insert into t2(name) values('b');
insert into t2(name) values('c');

结果如下

查看表详细信息

show create table t2 \G

其中AUTO_INCREMENT的值就是下一次要填充的值

在插入后获取上次插入的 AUTO_INCREMENT 的值(批量插入获取的是第一个值)

select last_insert_id();

唯一键 unique

一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键,

唯一键 unique 就可以 解决表中有多个字段需要唯一性约束的问题。

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

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

主键和唯一键并不是对立的,而是相辅相成的。

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

场景

学生信息:id  年龄  性别  身份证号  手机号  家庭住址

约束条件

id:可以设置成主键,用于快速索引,自增
年龄:非空约束
性别:非空约束,默认值 '未知'
身份证号:唯一键,非空约束,身份证号一定时唯一的
手机号:非空约束
家庭住址:非空约束,如果不精确到门牌号的话就不用设为唯一键
create table student(id tinyint unsigned primary key auto_increment comment '用于表示学生的唯一性',age tinyint unsigned not null comment '学生的年龄',gender char(2) not null default '未知' comment '学生的性别',identity_card varchar(20) not null unique comment '学生的身份证号',phone char(11) not null comment '手机号',address varchar(50) not null comment '家庭住址');

外键

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

用法

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

场景

学生信息:学生id ,姓名 ,班级id

班级信息:班级id , 班级名称,人数。

方案一

如果我们把班级信息和学生信息揉到一张表中,班级名称字段和人数字段会大量重复。

方案二

那么分别用两张表存储,不加外键约束。这样虽然我们认为这两张表是有关系的,但MySQL服务并不认为这两张表有关系。换句话说,MySQL服务不会拦截一些在逻辑上不和发的操作。

create table class( 
id tinyint unsigned not null, 
name varchar(40) not null ,size tinyint unsigned  );
create table student(id tinyint unsigned not null, name varchar(40) not null ,class_id tinyint unsigned not null);

表结构如下

班级表和学生表之间没有加外键约束。

先向班级表插入数据

insert into class values(1,'软件工程1班', 45),(2, '软件工程2班', 50);

结果如下

这表明此时该学校只有这两个班级

再向学生表中插入数据

insert into student values(1,'张三', 1),(2, '李四', 1),(3, '王五', 2);

结果如下

如果此时再向学生表插入 赵六,但他的班级id是3,这显然是不合法的,因为班级表中只有id为1 和 2 的两个班级,但由于没有外键的约束,此时依旧可以插入成功。

那如果我要在班级表中删掉id为1的班级依旧是不合法的,因为id为1的班级此时还有学生,但由于没有外键的约束,依旧可以删除成功

此时我们大概可以理解什么是外键约束了,两张表在业务上是有相关性的,但是在业务上没有建立约束关系,那么就可能出现问题。

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

方案三

那方案三自然是有外键约束的效果咯~

create table class_3( 
id tinyint unsigned primary key, 
name varchar(40) not null ,size tinyint unsigned  );
create table student_3(id tinyint unsigned not null, name varchar(40) not null ,class_id tinyint unsigned not null,foreign key (class_id) references class_3(id));

表结构如下

依旧是先向班级表中插入数据再向学生表中插入数据

insert into class_3 values(1,'软件工程1班', 45),(2, '软件工程2班', 50);
insert into student_3 values(1,'张三', 1),(2, '李四', 1),(3, '王五', 2);

如果此时再向学生表插入 赵六,但他的班级id是3。那么能插入成功吗?

明显是失败的,报错如下

 Cannot add or update a child row: a foreign key constraint fails (`db1`.`student_3`, CONSTRAINT `student_3_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `class_3` (`id`))

那删除班级表id为1的班级呢?

也失败了,报错如下

ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`db1`.`student_3`, CONSTRAINT `student_3_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `class_3` (`id`))

所以,这就是外键的作用。

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

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

相关文章

微知-lspci如何查看pcie设备树状结构(-t)

对于查看pcie设备列表除了看是否存在 还需要看拓扑结构。如何看? lspci -t以减号为分割说明 第一列数字是域段 和 bus id。比如0000:00中0000是域 00是busid 第二列 01.2中01是device id。2是functionid 如果还有下游设备device还有一个指定busid的序号

Postman文件上传接口测试

接口介绍 返回示例 测试步骤 1.添加一个新请求,修改请求名,填写URL,选择请求方式 2.将剩下的media参数放在请求body里,选择form-data,选择key右边的类型为file类型,就会出现选择文件的按钮Select Files&a…

QT翻金币小游戏(含音频图片文件资源)

目录 QT翻金币小游戏 音频图片资源文件获取 效果展示 图片 视频 实现代码 main.cpp mymainwindow.h mymainwindow.cpp startscene.h startscene.cpp selectscene.cpp playscene.h playscene.cpp mypushbutton.h mypushbutton.cpp dataconfig.h dataconfig.cpp QT…

大模型时代,云南白药如何成为一家AI医药企业?|产业AI案例

作者|斗斗 编辑|皮爷 出品|产业家 中医药大模型发布;英伟达成立AI制药部门,发力生物制药领域;赛诺菲与百图生科达成战略合作,共同开发用于生物治疗药物发现的领先模型;京东发布医疗大模型;百度“产业级”…

读软件开发安全之道:概念、设计与实施04缓解

1. 缓解 1.1. 安全思维转换为有效行动的方法就是首先预判威胁,然后针对可能的漏洞加以保护 1.2. 主动响应的做法就叫做“缓解” 1.2.1. mitigation 1.2.2. 喂宝宝的时候给孩子围上围嘴,避免掉下来的食物粘在宝宝的衣服上,还有安全带、限速…

ID3算法详解:构建决策树的利器

目录 引言 ID3算法概述 算法基础 信息熵 ​编辑 信息增益 ID3算法步骤 决策树 概念: 核心: 节点 1. 根节点 2. 非叶子节点 3. 叶子节点 引言 在机器学习领域,决策树是一种非常流行的分类和回归方法。其中,ID3算法作为决策树算法…

jenkins最佳实践(二):Pipeline流水线部署springCloud微服务项目

各位小伙伴们大家好呀,我是小金,本篇文章我们将介绍如何使用Pipeline流水线部署我们自己的微服务项目,之前没怎么搞过部署相关的,以至于构建流水线的过程中中也遇到了很多自己以前没有考虑过的问题,特写此篇&#xff0…

使用 Python 进行 PDF 文件加密

使用 Python 解密加密的 PDF 文件-CSDN博客定义一个名为的函数,该函数接受三个参数:输入的加密 PDF 文件路径input_pdf、输出的解密 PDF 文件路径output_pdf和密码password。https://blog.csdn.net/qq_45519030/article/details/141256661 在数字化时代…

Linux驱动开发基础(设备树)

所学来自百问网 目录 1. 引入设备树的原因 2. 设备树语法 2.1 Devicetree格式 2.1.1 DTS文件格式 2.1.2 node的格式 2.1.3 properties的格式 2.1.4 dts 文件包含dtsi文件 2.2 常用属性 2.2.1 #address-cells、#size-cells 2.2.2 compatible 2.2.3 model 2.2.4 st…

一步解决Ubuntu中/mnt/hgfs无共享文件夹的问题

当我们启用了共享文件夹后,但是在终端/mnt/hgfs任然没有文件 在终端输入 sudo vmhgfs-fuse .host:/ /mnt/hgfs/ -o allow_other 之后,就可以查到共享文件了

复现 LET-NET

摘要 稀疏光流法是计算机视觉中的一项基本任务。然而,它依赖于恒定的假设限制了其在高动态范围(HDR)场景中的适用性。在本研究中,我们提出了一种新的方法,旨在通过学习一个对光照变化具有鲁棒性的特征映射来超越图像的…

KubeSphere核心实战_kubesphere部署redis01_为redis指定配置文件_指定存储卷_配置服务---分布式云原生部署架构搭建047

然后我们再来,部署一下redis,可以看到,首先去容器官网去找到对应的redis的镜像然后 可以看到镜像中都有说的,如何启动,以及 --appendonly yes 是指定持久化.然后 /data表示数据存储的位置. 可以看到数据存储位置 然后还有配置文件的位置. 可以看到,我们首先去创建配置文件,然后…

LNMP 架构(Linux+NGINX+memcache+PHP)

目录 1 源码编译PHP与NGINX 1.1 NGINX 源码编译 1.2 PHP 源码编译安装 2 实现PHP与NGINX的连接 2.1 php-fpm的详细介绍 2.2 LNMP与LAMP的区别 2.3 PHP配置文件的介绍 2.4 实例实现php-fpm 与 NGINX的连接 2.4.1 指定pid的存放位置 2.4.2 php-fpm设置监听自己端口与IP 2.4.3 主配…

配置 昇腾 Ascend C/C++ 开发环境

配置 昇腾 Ascend C/C 开发环境 flyfish 这里以Orange Pi Ai Pro 为例 先说如何配置MindStudio,然后再说如何查看Orange Pi Ai Pro的一些信息 Orange Pi AI Pro 开发板是香橙派联合华为精心打造的高性能AI 开发板,其搭载了昇腾 AI 处理器。Linux 桌面…

VSCode系列 - 如何用VSCode搭建C++高效开发环境(2)

1. 插件的用法 1.1. C/C 1.1.1. 插件介绍1.1.2. 插件配置 1.2. Clang-Format1.3. cpp-check-lint 1.3.1. cpplint1.3.2. cppcheck1.3.3. 插件的使用 1.4. C/C Advanced Lint 1.4.1. 插件介绍1.4.2. 插件配置 1.5. Bracket Pair Colorizer 1.5.1. 插件介绍1.5.2. 功能配置 1.6. …

【机器学习】探索机器学习在旅游业的革新之旅

📝个人主页🌹:Eternity._ 🌹🌹期待您的关注 🌹🌹 ❀目录 🔍1. 引言📒2. 机器学习在旅游需求分析中的应用🌞用户行为数据分析🌙旅客偏好预测模型⭐…

Java面试八股之如何保证消息队列中消息不重复消费

如何保证消息队列中消息不重复消费 要保证消息队列中的消息不被重复消费,通常需要从以下几个方面来着手: 消息确认机制: 对于像RabbitMQ这样的消息队列系统,可以使用手动确认(manual acknowledge)机制来…

C++ 设计模式——策略模式

策略模式 策略模式主要组成部分例一:逐步重构并引入策略模式第一步:初始实现第二步:提取共性并实现策略接口第三步:实现具体策略类第四步:实现上下文类策略模式 UML 图策略模式的 UML 图解析 例二:逐步重构…

【c语言】整数在内存中的储存(大小端字节序)

整数在内存中的储存(大小端字节序) 1.整数在内存中的储存 2.大小端字节序 3.整数在内存中储存例子 4.字节序判断 5.死循环现象 文章目录 整数在内存中的储存(大小端字节序)整数在内存中的储存大小端字节序什么是大小端为什么会有…

Unity 麦扣 x 勇士传说 全解析 之 怪物基类(2)(附各模块知识的链接,零基础也包学会的牢弟)(案例难度:★★☆☆☆)

1.怪物的动画逻辑一览 2.怪物的受伤死亡逻辑一览 using System.Collections; using System.Collections.Generic; using System.Xml; using UnityEngine;public class Monster : MonoBehaviour {[Header("速度")]public float normalSpeed;public float chaseSpeed;…