主键(设置/删除方法,复合主键),唯一键,主键和唯一键的应用差异,自增长字段(如何实现,查看上次的值),外键(引入,外键约束)

news2024/11/19 8:29:12

目录

主键(primary key)

介绍

作用

设置主键

建表前

建表后

复合主键

介绍

示例 

删除主键

唯一键(unique)

介绍

意义

示例

建表

主键

唯一键

插入数据示例

主键和唯一键的应用差异

主键

唯一键

索引

auto_increment

介绍

示例 

自动插入

手动插入

如何实现自增

手动设置初始值

介绍

示例

last_insert_id()

外键

引入

介绍

问题示例

分析

解决

外键约束

介绍

作用

示例

不同错误导致自增长字段处理不同


主键(primary key)

介绍

格式为 primary key

  • 主键列的数据不可重复,不可为空(也就是自动设置为not null)
  • 一张表中最多只能有一个主键
  • 主键所在的列通常是整数类型

作用

可以作为某行数据的唯一标识符,然后进行增删查改(利用where)

设置主键

建表前

属性列设置中添加

单独一行添加 primary key (属性列名)

被设置主键的列中,key会被设置为pri:

建表后

alter table 表名 add primary key(属性列名)

建表后设置主键,需要保证该列属性没有重复,才能设置:

  • 我们重新建立一张没有主键的表:
  • 并且插入相同数据:
  • 然后我们设置id为主键,会发现mysql并不允许,因为id列存在重复数据:
  • 所以我们需要先删除重复数据,然后重新插入:
  • 之后我们再次设置id为主键,就成功了:

复合主键

介绍

一张表只有一个主键,但一个主键可以被添加到多列

格式 primary key (属性列名1 , 属性列名2 ...)

  • 它用于将设置为主键的属性列的数据绑定在一起,让这个绑定后的数据不会重复出现
  • 换句话说,只有当这几列的数据同时重复,才不被允许
  • 其中某列重复,是可以的

示例 

我们设置一个选课的场景

选课的时候,我们可以一个人选多门课,多个人选一门课,但并不允许一个人重复选同一门课

所以我们可以将人和课作为复合主键,来规避这样的问题:

  • 根据复合主键的特性,以下数据都是合法的:
  • 但是,他不允许出现同时重复:

删除主键

alter table + 表名 + drop primary key

因为每张表只有一个主键,所以直接对表进行删除主键即可

唯一键(unique)

介绍

格式 unique (key)

和主键一样,数值不能重复 

但它可以为空,其中空字段不作唯一性比较,所以可以多个为空

意义

也许你可能会好奇,为什么有了主键,还需要有唯一键呢?

  • 虽然一张表中只能有一个主键,但是,不仅只有选择设置为主键的属性需要保证唯一性,其他属性可能也会有这样的需求
  • 唯一键就是为了实现这个功能

示例

建表

和主键使用基本相同(唯一不同就是,唯一键可以省略key,但主键不行)

主键

唯一键

和主键一样,除了可以在属性列中设置唯一键,也可以单独一行设置(且可以省略key):

设置唯一键后:

插入数据示例

因为它可以为null,所以可以省略该列,默认值为null:

当然也可以手动插入null:

唯一限制就是不能重复:

 

主键和唯一键的应用差异

主键

  • 更多的是用来标识该行数据在整张表中的唯一性
  • 比如id,身份证,学号等等,用来表示这行数据属于谁
  • 且尽量让主键和当前业务无关,这样在进行业务调整时,可以保证尽量不调整主键

唯一键

  • 只是为了保证该列数据不出现重复
  • 比如,电话号码,身份证等等
  • 当这些属性不是主键,但需要保证唯一性时,就需要设置为唯一键

索引

MySQL 索引是一种数据结构,用于提高数据库查询性能

  • 索引类似于书籍的目录,通过在数据表中创建索引,可以更快地定位和检索数据
  • 比如我们上面介绍的主键和唯一键,都属于索引
  • 这里我们仅仅简单提一下,之后会详细介绍

auto_increment

介绍

可以自己增加数值,不需要我们手动插入

  • 自增长字段必须是整数类型
  • 要做自增长的属性,必须是索引key一栏有值),一般和主键搭配使用
  • 和主键一样,一张表只能有一个自增长
  • 默认从1开始

示例 

我们先建立一张表,且id属性设置为主键,自增长:

自动插入

即使我们不插入数值,它也会自动从1开始:

再次无数值插入,id自增为2:

如果我们插入非法数值:

手动插入

也可以手动插入数据:

然后进行无数值插入,会发现这一次自增是从10开始的:

所以,我们可以得出一个结论 -- 新的数值=最后一个数值+1

 

如何实现自增

实际上,表外有一个字段auto_increment,用于存放当前的auto_increment值+1

我们可以通过查看建表语句看到,此时该值为12:

恰好上一次id自增成了11:

所以我们可以发现,其实每次改变的都是表外的字段,然后这个值会作为下一次插入数据时auto_increment的起始值,这样就实现了自增

手动设置初始值

介绍

可以在建表时,手动设置auto_increment的初始值

格式 (建表语句)auto_increment=xx;

示例

我们设置10为初始值:

last_insert_id()

last_insert_id() 可以获取最后一次插入时的auto_increment值

比如,我们在上面的最后一次插入操作中,id=10,他就返回了10:

外键

引入

介绍

外键用于建立两张表之间的联系

外键是从表中的一个属性,主表提供从表所需的信息

从表依附于主表

  • 比如学生依附于班级
  • 在插入学生信息前,班级信息就得存在了

问题示例

我们创建两张表,学生表和班级表:

我们想让学生表中的class_id和班级表的id是相同的,这样就建立起了联系:

  • 首先完善好班级表:
  • 然后插入学生信息:
  • 但是我们无法规避一些错误:
分析
  • 当我们插入并不存在的班级id时,mysql并没有提示我们,因为它是合法的; 但从逻辑上来说是错误的
  • 因为此时我们建立的联系并不完整,看似建立了联系,实际上根本没有
解决
  • 所以,我们需要一些约束,来帮助我们建立联系 -- 也就是外键约束
  • 就像道德和法律的关系,道德的约束虚无缥缈,我们需要强硬的法律手段来维护公平正义

 

外键约束

介绍

用于建立表与表之间关系的一种约束

  • 格式 foreign key (外键列名) references 关联的主表名 (关联的列名)

作用

  • 外键字段的数值,必须在主表的主键列中存在
  • 删除主表中的数据时,从表中不能还存在与其对应的数据

这都是为了保证数据的完整性,维护它们的对应关系

示例

我们首先删除原先的std表,然后创建新表:

可以看到,设置为外键的列,其key列为MUL

然后我们向学生表插入数据:

这次插入110班(不存在的班级),就插入失败了

 

不同错误导致自增长字段处理不同

在进行操作的时候,我发现,发生外键错误,id会自增

而其他错误(比如,一个not null属性的name,不提供值,id不会自增)

在发生外键错误前后,插入正确值:

在发生默认值错误后,插入正确值:

这样操作后的表:

很明显在发生外键错误的中间,id出现了断层

但是我不明白,为什么不同的错误会有差异,先搁置在这吧(瘫倒)

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

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

相关文章

达梦数据实时同步软件DMHS介绍和原理

1、产品介绍 达梦数据实时同步软件(以下简称 DMHS)是支持异构环境的高性能、高可靠、高可扩展数据库实时同步复制系统。该产品采用基于日志的结构化数据复制技术,不依赖主机上源数据库的触发器或者规则,对主机源数据库系统几乎无影…

系列六、Spring Security中的认证 授权 角色继承

一、Spring Security中的认证 & 授权 & 角色继承 1.1、概述 关于Spring Security中的授权,请参考【系列一、认证 & 授权】,这里不再赘述。 1.2、资源类 /*** Author : 一叶浮萍归大海* Date: 2024/1/11 20:58* Description: 测试资源*/ Re…

案例120:基于微信小程序的校友林设计与实现

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…

蓝桥杯省赛无忧 STL 课件18 总结

3226 宝藏排序 II 1624 小蓝吃糖果 2490 小蓝的括号串1 1531快递分拣

ubuntu 2022.04 安装vcs2018和verdi2018

主要参考网站朋友们的作业。 安装时参考: ubuntu18.04安装vcs、verdi2018_ubuntu安装vcs-CSDN博客https://blog.csdn.net/qq_24287711/article/details/130017583 编译时参考: 【ASIC】VCS报Error-[VCS_COM_UNE] Cannot find VCS compiler解决方法_e…

远程登陆利器 ssh

文章目录 远程登陆利器 ssh登陆远程服务器指定用户名多数情况的登陆方式查看服务器的时间指定端口更多信息 远程登陆利器 ssh ssh命令是openssh套件中的客户端连接工具,使用加密协议实现安全的远程登录服务器,实现对服务器的远程管理。 官方定义为&…

响应式编程初探-自定义实现Reactive Streams规范

最近在学响应式编程,这里先记录下,响应式编程的一些基础内容 1.名词解释 Reactive Streams、Reactor、WebFlux以及响应式编程之间存在密切的关系,它们共同构成了在Java生态系统中处理异步和响应式编程的一系列工具和框架。 Reactive Streams…

原生js实现拖拽效果

<!DOCTYPE html> <html> <head> <style> #mydiv { width: 200px; height: 200px; background-color: red; position: absolute; cursor: move; } </style> | </head> <body> <div id"mydiv">拖拽我…

苏州倍丰智能新型雾化粉末技术量产成功!金属3D打印全产业链更进一步

苏州倍丰智能深耕金属3D打印技术领域&#xff0c;以金属3D打印全产业链为目标&#xff0c;围绕金属3D打印设备&#xff0c;涵盖包括金属粉末前后处理设备、金属粉末原材料制备、先进工艺研发等多个领域&#xff0c;完成了一整条自上而下的金属3D打印全产业链。 近日&#xff0c…

java大数据hadoop2.9.2 Java编写Hadoop分析平均成绩

1、准备文件&#xff0c;例如score.txt&#xff0c;内容如下&#xff1a; zs k1 88 ls k1 98 ww k1 78 zs k2 88 ls k2 98 ww k2 78 zs k3 88 ls k3 98 ww k3 78 2、创建maven项目 <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common --><d…

哈希表与哈希算法(Python系列30)

在讲哈希表数据结构和哈希算法之前&#xff0c;我想先刨析一下数组和python中的列表 首先来讲一下数组&#xff0c;我想在这提出一个疑问&#xff1a; 为什么数组通过索引查询数据的时间复杂度为O(1)&#xff0c;也就是不管数组有多大&#xff0c;算法的执行时间都是不变的。…

《SPSS统计学基础与实证研究应用精解》视频讲解:SPSS 软件的安装要求、启动与关闭

《SPSS统计学基础与实证研究应用精解》1.6 视频讲解 视频为《SPSS统计学基础与实证研究应用精解》张甜 杨维忠著 清华大学出版社 一书的随书赠送视频讲解1.6节内容。本书已正式出版上市&#xff0c;当当、京东、淘宝等平台热销中&#xff0c;搜索书名即可。本书旨在手把手教会使…

【ROS2】使用C++实现简单的发布订阅方

1 构建自定义数据类型 1、自定义消息类型Student 1.1 创建base_interfaces_demo包 1.2 创建Student.msg文件 string name int32 age float64 height 1.2 在cmakeLists.txt中增加如下语句 #增加自定义消息类型的依赖 find_package(rosidl_default_generators REQUIRED) # 为…

操作系统复习篇

目录 一、引论 1.1、操作系统的目标 方便性&#xff1a; 有效性&#xff1a; 可扩充性&#xff1a; 开放性&#xff1a; 1.2、操作系统的作用 用户与计算机硬件系统之间的接口&#xff1a; 计算机系统资源的管理者&#xff1a; 实现对计算机资源的抽象&#xff1a; 1…

PDF结构详解

文章目录 介绍前言高保真的文件什么是PDF&#xff1f;PDF的一些优点版本摘要谁在使用PDF&#xff1f;有用的免费软件谁应该阅读 构建一个简单PDF文件基本PDF语法File StructureDocument ContentPage Content 构建简单PDF文件头目录&#xff0c;交叉引用表和文件尾主要对象图形内…

Github Copilot最全的安装与使用教程:一款非常好用的AI编程工具

Github Copilot最全的安装与使用教程 第一章 安装1.安装 GitHub Copilot2.获取资格第二章 使用1.产生建议1.1 键入你想要完成的操作的注释1.2 CtrlI 2. 接受建议3.查看下一个建议3.接受部分建议4.在新选项卡接受建议5.完成多项功能6.聊天 GitHub Copilot 供经过验证的学生、教师…

DAY7--learning english

一、积累 1.instinct Bro showed me his primal instinct 老兄给我展示他原始的本能&#xff08;返祖现象&#xff09;. 2. assembly Todays assembly is about part of journey. 今天的集会是讲述关于旅程的一部分。 3.aluminum Aluminum Casting Motocycle Engine Cover. …

java基础知识点系列——数据输入(五)

java基础知识点系列——数据输入&#xff08;五&#xff09; 数据输入概述 Scanner使用步骤 &#xff08;1&#xff09;导包 import java.util.Scanner&#xff08;2&#xff09;创建对象 Scanner sc new Scanner(System.in)&#xff08;3&#xff09;接收数据 int i sc…

数据结构.线性表(2)

一、模板 例子&#xff1a; a: b: 二、基本操作的实现 &#xff08;1&#xff09;初始化 &#xff08;2&#xff09;销毁和清空 &#xff08;3&#xff09;求长度和判断是否为空 &#xff08;4&#xff09;取值 &#xff08;5&#xff09;查找 &#xff08;6&#xff09;插入 &…

使用VS2015在win7 x64上编译调试FFmpeg(附源码和虚拟机下载)

1. 前言 在文章《使用VS2017在win10 x64上编译调试FFmpeg&#xff08;附源码和虚拟机下载&#xff09;》中&#xff0c;我们在win10VS2017的环境下基于开源项目ShiftMediaProject完成了FFmpeg源码调试环境的配置。在win7VS2015的环境下&#xff0c;ShiftMediaProject配置过程和…