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

目录

主键(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.mfbz.cn/a/320988.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电子签章系统,怎么做到大量文件自动电子签章?

在当今信息爆炸的时代,海量文件的签署管理成为各行业面临的挑战之一。电子签章系统的出现,为解决这一问题提供了有效途径。本文将探讨电子签章系统如何实现海量文件自动签章,提高工作效率并确保安全性。 钉钉、企微、飞书、OA、CRM、ERP等&a…

K8S API访问控制之RBAC利用

前言 K8S对于API的访问安全提供了访问控制,主要为4个阶段,本文为第二个阶段——鉴权的RBAC。RBAC是基于角色的访问控制,使用kubeadm安装集群1.6版本以上的都默认开启了RBAC。本文主要研究集群可能存在的利用点及相对应的利用手法。 API访问…

图像的初识

一、图像的数组表示 RGB能够构成人眼所能识别的所有颜色。 二、图像的变换 Example: img.shape Out[329]: (512, 768, 3) img.dtype Out[330]: dtype(uint8) #补值变换 shift_temp_img [255,255,255] - img shift_img Image.fromarray(shift_temp_img.astype(ui…

机器学习~从入门到精通(二)线性回归算法和多元线性回归

为什么要做数据归一化 一、数据归一化: 1.最值归一化 2.均值方差归一化import numpy as npX np.random.randint(1,100,size100) X X.reshape(-1,2) X.shape X np.array(X,dtypefloat) X[:,0] (X[:,0]-np.min(X[:,0]))/(np.max(X[:,0])-np.min(X[:,0])) X[:,1]…

class_4:car类

#include <iostream> using namespace std; class Car{ public://成员数据string color; //颜色string brand; //品牌string type; //车型int year; //年限//其实也是成员数据&#xff0c;指针变量&#xff0c;指向函数的变量&#xff0c;并非真正的成员函数void (*…

强化学习应用(六):基于Q-learning的物流配送路径规划研究(提供Python代码)

一、Q-learning算法简介 Q-learning是一种强化学习算法&#xff0c;用于解决基于马尔可夫决策过程&#xff08;MDP&#xff09;的问题。它通过学习一个值函数来指导智能体在环境中做出决策&#xff0c;以最大化累积奖励。 Q-learning算法的核心思想是使用一个Q值函数来估计每…

C# .NET SQL sugar中 IsAny进行根据条件判断数据是否存在 IsAny的使用

SQL sugar 中控制器直接判断数据是否存在 首先确保你的Service层继承的表名 控制器中使用IsAny进行根据条件判断数据是否存在

Redis命令 - Sets命令组常用命令

Set集合&#xff0c;无序&#xff0c;一堆不重复值的组合。利用redis提供的set数据结构&#xff0c;可以存储一些集合性的数据。 使用场景&#xff1a;例如&#xff0c;实现如共同关注、共同喜好、二度好友等 1、SADD key member [member …] 向集合中添加一个或者多个成员 …

Windows Server调整策略实现999999个远程用户用时登录

正文共&#xff1a;1234 字 23 图&#xff0c;预估阅读时间&#xff1a;2 分钟 上篇文章中&#xff08;Windows Server 2019配置多用户远程桌面登录服务器&#xff09;&#xff0c;我们主要介绍了Windows Server 2019在配置远程桌面时&#xff0c;如何通过3种方式创建本地用户账…

Harbor安装

采用原生的方式安装Harbor 下载Harbor安装包&#xff1a;https://github.com/goharbor/harbor/releases/download/v2.3.4/harbor-offline-installer-v2.3.4.tgz 拖拽到Linux并解压&#xff1a; tar -zxvf harbor-offline-installer-v2.3.4.tgz -C /usr/local/修改Harbor配置文…

Python-AST语法树

一、抽象语法树 1、什么是抽象语法树 在计算机科学中&#xff0c;抽象语法树&#xff08;abstract syntax tree &#xff0c;AST&#xff09;&#xff0c;是源代码的抽象语法结构的树状表现形式&#xff0c;这里特指编程语言的源代码。AST是编译器或解释器在处理源代码时所使…

原子类-入门介绍和分类说明、基本类型原子类

Atomic翻译成中文是原子的意思。在化学上,我们知道原子是构成一般物质的最小单位,在化学 反应中是不可分割的。在我们这里Atomic是指一个操作是不可中断的。即使是在多个线程一起执 行的时候,一个操作一旦开始,就不会被其他线程干扰。 基本类型原子类 AtomicInteger:整…

QT上位机开发(权限管理)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 如果只是简单的工具软件&#xff0c;其实是没有权限管理这么一说的。比如说&#xff0c;串口工具、485工具之类的软件&#xff0c;其实根本不存在所…

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

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

数据在AI图像修复任务中的核心作用

在人工智能&#xff08;AI&#xff09;领域&#xff0c;数据的重要性不言而喻。尤其在图像修复任务中&#xff0c;数据的精度和质量直接影响着AI模型的性能。图像修复是指利用AI技术自动识别图像中的缺陷或遮挡物&#xff0c;并对其进行修复或还原的过程。这项技术广泛应用于各…

LLM大模型和数据标注

对于那些不精通机器学习的人来说&#xff0c;像 ChatGPT 所基于的 GPT-3.5 这样的大型语言模型似乎是自给自足的。这些模型通过无监督或自我监督学习进行训练。简而言之&#xff0c;只需极少的人工干预&#xff0c;就能生成一个能像人类一样对话的模型。 这就引出了一个问题--…

3.三极管和MOS管

3.三极管和MOS管 基础知识三极管是电流控制型器件MOS管是电压控制型器件 分类及引脚定义电流导通方向基础应用常用MOS管电平转换电路MOS管实现电平转换用MOS管实现的“I2C总线电平转换电路”&#xff0c;实现3.3V电压域与5V电压域间的双向通讯 基础知识 三极管是电流控制型器件…

C语言中关于指针的理解及用法

关于指针意思的参考&#xff1a;https://baike.baidu.com/item/%e6%8c%87%e9%92%88/2878304 指针 指针变量 地址 野指针 野指针就是指针指向的位置是不可知的&#xff08;随机的&#xff0c;不正确的&#xff0c;没有明确限制的&#xff09; 以下是导致野指针的原因 1.指针…

ZZULIOJ 1110: 最近共同祖先(函数专题)

题目描述 如上图所示&#xff0c;由正整数1, 2, 3, ...组成了一棵无限大的二叉树。从某一个结点到根结 点&#xff08;编号是1 的结点&#xff09;都有一条唯一的路径&#xff0c;比如从10 到根结点的路径是(10, 5, 2, 1)&#xff0c; 从4 到根结点的路径是(4, 2, 1)&#xff0…

【python playwright 安装及验证】

python playwright pip install playwright pip install playwright -i http://mirrors.aliyun.com/pypi/simple/ playwright codegen -o script.py -b chromium --ignore-https-errors --viewport-size “2560,1440” --proxy-server “http://100.8.64.8:60497” https://w…
最新文章