[MySQL][表的约束][二][主键][自增长][唯一键][外键]详细讲解

news2024/11/15 10:27:42

目录

  • 1.主键
  • 2.自增长
    • 1.是什么?
    • 2.索引
  • 3.唯一键
  • 4.外键
    • 1.为什么?
    • 2.是什么?
    • 3.如何理解外键约束?
  • 5.综合案例 -- 阅读


1.主键

  • 主键:primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个

    • 不意味着一个表中的主键,只能添加给一列
      • 一个主键可以被添加到一列,或者多列上 – 复合主键
  • 示例:创建表的时候直接在字段上指定主键

    mysql> create table t4 (
    -> id int unsigned primary key comment '学号不能为空',
    -> name varchar(20) not null);
    
    mysql> desc t4;
    +-------+------------------+------+-----+---------+-------+
    | Field | Type             | Null | Key | Default | Extra |
    +-------+------------------+------+-----+---------+-------+
    | id    | int(10) unsigned | NO   | PRI | NULL    |       | # key中pri表示该字段是主键
    | name  | varchar(20)      | NO   |     | NULL    |       |
    +-------+------------------+------+-----+---------+-------+
    
  • 主键约束:主键对应的字段中不能重复,一旦重复,操作失败

    mysql> insert into t4 values(1, 'aaa');
    mysql> insert into t4 values(1, 'aaa');
    ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
    
  • 当表创建好以后但是没有主键的时候,可以再次追加主键

    alter table 表名 add primary key(字段列表)
    
  • 删除主键

    alter table 表名 drop primary key;
    
    mysql> alter table t4 drop primary key;
    mysql> desc t4;
    +-------+------------------+------+-----+---------+-------+
    | Field | Type             | Null | Key | Default | Extra |
    +-------+------------------+------+-----+---------+-------+
    | id    | int(10) unsigned | NO   |     | NULL    |       |
    | name  | varchar(20)      | NO   |     | NULL    |       |
    +-------+------------------+------+-----+---------+-------+
    
  • 复合主键:在创建表的时候,在所有字段之后,使用primary key来创建主键,如果有多个字段作为主键,可以使用复合主键

    mysql> create table t5(
    -> id int unsigned,
    -> course char(10) comment '课程代码',
    -> score tinyint unsigned default 60 comment '成绩',
    -> primary key(id, course) <= id和course为复合主键
    -> );
    
    mysql> desc t5;
    +--------+---------------------+------+-----+---------+-------+
    | Field  | Type                | Null | Key | Default | Extra |
    +--------+---------------------+------+-----+---------+-------+
    | id     | int(10) unsigned    | NO   | PRI | 0       |       | <= 这两列合成主键
    | course | char(10)            | NO   | PRI |         |       |
    | score  | tinyint(3) unsigned | YES  |     | 60      |       |
    +--------+---------------------+------+-----+---------+-------+
    
    mysql> insert into t5 (id,course)values(1, '123');
    
    mysql> insert into t5 (id,course)values(1, '123');
    ERROR 1062 (23000): Duplicate entry '1-123' for key 'PRIMARY' <= 主键冲突
    

2.自增长

1.是什么?

  • auto_increment
    • 当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值 +1操作,得到一个新的不同的值
    • 通常和主键搭配使用,作为逻辑主键
  • 自增长的特点
    • 任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)
    • 自增长字段必须是整数
    • 一张表最多只能有一个自增长
  • 示例:
    mysql> create table t6(
    -> id int unsigned primary key auto_increment,
    -> name varchar(10) not null default ''
    -> );
    
    mysql> insert into tt21(name) values('a');
    mysql> insert into tt21(name) values('b');
    
    mysql> select * from tt21;
    +----+------+
    | id | name |
    +----+------+
    | 1  | a    |
    | 2  | b    |
    +----+------+
    
    • 在插入后获取上次插入的 AUTO_INCREMENT 的值(批量插入获取的是第一个值)
      mysql > select last_insert_id();
      +------------------+
      | last_insert_id() |
      +------------------+
      | 1                |
      +------------------+
      

2.索引

  • 在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单
  • 索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容
  • 索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。 数据库使用索引以找到特定值,然后顺指针找到包含该值的行。这样可以使对应于表的SQL语句执行得更快,可快速访问数据库表中的特定信息

3.唯一键

  • 一张表中往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键:唯一键就可以解决表中有多个字段需要唯一性约束的问题
  • 唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性比较
  • 关于唯一键和主键的区别,可以简单理解成:
    • 主键更多的是标识唯一性的
    • 而唯一键更多的是保证在业务上,不要和别的信息出现重复
  • 乍一听好像没啥区别,举一个例子
    • 假设一个场景(仅仅为了助理解)
    • 比如在公司,需要一个员工管理系统,系统中有一个员工表,员工表中有两列信息,一个身份证号码,一个是员工工号,可以选择身份号码作为主键
    • 而设计员工工号的时候,需要一种约束:所有的员工工号都不能重复
    • 具体指的是在公司的业务上不能重复,我们设计表的时候,需要这个约束,那么就可以将员工工号设计成为唯一键
  • 一般而言,建议将主键设计成和当前业务无关的字段,这样,当业务调整的时候,我们可以尽量不会对主键做过大的调整
  • 示例:
    mysql> create table student (
    -> id char(10) unique comment '学号,不能重复,但可以为空',
    -> name varchar(10)
    -> );
    
    mysql> insert into student(id, name) values('01', 'aaa');
    mysql> insert into student(id, name) values('01', 'bbb'); <=唯一约束不能重复
    ERROR 1062 (23000): Duplicate entry '01' for key 'id'
    
    mysql> insert into student(id, name) values(null, 'bbb'); -- 但可以为空
    
    mysql> select * from student;
    +------+------+
    | id   | name |
    +------+------+
    | 01   | aaa  |
    | NULL | bbb  |
    +------+------+
    

4.外键

1.为什么?

  • 如下面示例,即便学生表通过class_id设置了和班级表的联系,但是不具备任何的约束力

    • 可能错误地插入一个不存在班级的学生
    • 可能删除了一个还有学生的班级
  • class_id只有外键之名(关联关系),没有外键之实(约束关系)

    请添加图片描述

    请添加图片描述

  • 外键:

    1. 从表和主表的关联关系
    2. 产生外键约束

2.是什么?

  • 外键用于定义主表和从表之间的关系

    • 外键约束主要定义在从表上
    • 主表则必须是有主键约束或unique约束
    • 当定义外键后,要求外键列数据必须在主表的主键列存在或为NULL
  • 语法:

    foreign key (字段名) references 主表(列)
    
  • 示例:
    请添加图片描述

  • 如果将班级表中的数据都设计在每个学生表的后面,那就会出现数据冗余

    • 所以只要设计成让stu->class_id和myclass_id形成关联关系 --> 外键约束
  • 对上面的示意图进行设计:

  1. 先创建主键表
    create table myclass (
    id int primary key,
    name varchar(30) not null comment'班级名'
    );
    
  2. 再创建从表
    create table stu (
    id int primary key,
    name varchar(30) not null comment '学生名',
    class_id int,
    foreign key (class_id) references myclass(id)
    );
    
  3. 正常插入数据
    mysql> insert into myclass values(10, '高三(9)班'),(20, '高三(19)班');
    Query OK, 2 rows affected (0.03 sec)
    Records: 2 Duplicates: 0 Warnings: 0
    
    mysql> insert into stu values(100, '张三', 10),(101, '李四',20);
    Query OK, 2 rows affected (0.01 sec)
    Records: 2 Duplicates: 0 Warnings: 0
    
  4. 插入一个班级号为30的学生,因为没有这个班级,所以插入不成功
    mysql> insert into myclass values(10, '高三(9)班'),(20, '高三(19)班');
    Query OK, 2 rows affected (0.03 sec)
    Records: 2 Duplicates: 0 Warnings: 0
    
    mysql> insert into stu values(100, '张三', 10),(101, '李四',20);
    Query OK, 2 rows affected (0.01 sec)
    Records: 2 Duplicates: 0 Warnings: 0
    
  5. 插入班级id为null,比如来了一个学生,目前还没有分配班级
    mysql> insert into stu values(102, 'wangwu', null);
    

3.如何理解外键约束?

  • 首先我们承认,这个世界是数据很多且大多都是相关性的
  • 理论上,上面的例子,不创建外键约束,就正常建立学生表,以及班级表,该有的字段我们都有
  • 此时,在实际使用的时候,可能会出现什么问题?
    • 有没有可能插入的学生信息中有具体的班级,但是该班级却没有在班级表中?
  • 因为此时两张表在业务上是有相关性的,但是在业务上没有建立约束关系,那么就可能出现问题
    • 解决方案就是通过外键完成的
  • 建立外键的本质其实就是把相关性交给MYSQL去审核了,提前告诉MYSQL表之间的约束关系
    • 那么当用户插入不符合业务逻辑的数据的时候,MYSQL不允许你插入

5.综合案例 – 阅读

  • 有一个商店的数据,记录客户及购物情况,有以下三个表组成:
    • 商品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)
  • 要求:
    • 每个表的主外键
    • 客户的姓名不能为空值
    • 邮箱不能重复
    • 客户的性别(男,女)
    -- 创建数据库
    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/1926426.html

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

相关文章

Linux系列--命令详解

目录 一、Linux资源管理方式 二、查询类型命令详解 三、文件管理类型命令详解 四、文件压缩与解压 五、文件编辑 六、系统命令 七、文件内容查看命令 一、Linux资源管理方式 linux操作系统采用一个文档树来组织所有的资源。这棵树的根目录的名字叫做&#xff1a;//…

护网HW面试常问——webshell内存马流量特征以及查杀

参考&#xff1a;学习干货|HVV必学远控工具及Webshell流量合集分析(建议收藏附面试题) 蚁剑 ini_set ini_set_time ini_set_limit ini_set("display_errors","0") 部分代码明文传输&#xff0c;较好辨认 哥斯拉 1、User-Agent (弱特征) 在默认的情况…

电脑文件误删除如何恢复?Top12电脑数据恢复软件汇总合集!(图文详解)

电脑文件误删除如何恢复&#xff1f;在日常使用电脑过程中&#xff0c;我们经常会遇到意外删除文件的情况。可能是因为按错了按键、误操作了鼠标&#xff0c;或者意外格式化了存储设备。这些情况都可能导致重要的文件不小心被删除。但是不用担心&#xff0c;有许多专业的数据恢…

【stm32】新建stm32标准库函数工程

新建stm32标准库函数工程 一.工程必要文件创建二、新建main函数三、添加库函数文件四、补充User文件夹下的文件五、工程启动文件选择 官方提供的stm32标准外设库文件所包含的内容介绍&#xff1a; 一.工程必要文件创建 前提&#xff1a;先通过keil新建一个项目工程 1.在新建工程…

Linux系统升级OpenSSH版本到openssh-9.8p1

1、升级OpenSSH就要对应的升级OpenSSL&#xff0c;所以要同时要准备openssh-9.8p1.tar.gz和openssl-3.3.1.tar.gz 2、将两个压缩包上传到/home/user目录。 3、为了防止ssh安装失败导致无法连接服务器&#xff0c;需要先安装并启动telnet连接协议&#xff0c;命令如下&#xf…

2024 微信小程序 学习笔记 第一天

微信公众平台 (qq.com) 小程序代码的构成 项目结构 JSON 配置文件 WXML 模板 WXSS 样式 JS 逻辑交互 小程序的宿主环境 宿主 通信模型 运行机制 组件 视图组件 view scrioll-view swiper swiper-item swiper属性 text button image image mode属性 小程序API 协…

[Linux]CentOS软件的安装

一、Linux 软件包管理器 yum 1.Linux安装软件的方式 在linux中安装软件常用的有三种方式&#xff1a; 源代码安装&#xff08;我们还需要进行编译运行后才可以&#xff0c;很麻烦&#xff09; rpm安装&#xff08;Linux的安装包&#xff0c;需要下载一些rpm包&#xff0c;但是…

SpringBoot+Vue实现简单的文件上传(txt篇)

SpringBootVue实现简单的文件上传 1 环境 SpringBoot 3.2.1&#xff0c;Vue 2&#xff0c;ElementUI 2 页面 3 效果&#xff1a;只能上传txt文件且大小限制为2M&#xff0c;选择文件后自动上传。 4 前端代码 <template><div class"container"><el-…

MySQl高级篇 -索引优化篇

索引 InnoDB采用了一个B数来存储索引&#xff0c;使得在千万级数据量的一个情况下&#xff0c;树的高度可以控制在3层以内&#xff0c;而层高代表磁盘IO的一个次数&#xff0c;因此基于索引查找可以减少磁盘IO的次数 MySQL的索引是在存储引擎层实现的&#xff0c;不同的存储引…

AI 歌词创作:突破想象,惊艳听觉

在音乐的世界里&#xff0c;歌词是触动心灵的钥匙&#xff0c;是引发共鸣的桥梁。而如今&#xff0c;AI 歌词创作正以其惊人的力量&#xff0c;突破我们的想象&#xff0c;为我们带来前所未有的听觉盛宴。 “妙笔生词智能写歌词软件&#xff08;veve522&#xff09;”便是这场…

Prometheus 云原生 - Prometheus 数据模型、Metrics 指标类型、Exporter 相关

目录 开始 Prometheus 数据类型 简单理解 时序样本 格式 和 命名要求 Metrics 指标类型 Counter 计数器 Gauge Histogram Summary Exporter 相关 概述 Exporter 类型 Exporter 规范 开始 Prometheus 数据类型 简单理解 a&#xff09;安装好 Prometheus 后会暴露…

tomcat的优化、动静分离

tomcat的优化 tomcat自身的优化 tomcat的并发处理能力不强&#xff0c;大项目不适应tomcat做为转发动态的中间件&#xff08;k8s集群&#xff0c;pytnon rubby&#xff09;&#xff0c;小项目会使用&#xff08;内部使用的&#xff09;动静分离 默认配置不适合生产环境&…

基于SpringBoot+VueJS+微信小程序技术的图书森林共享小程序设计与实现

注&#xff1a;每个学校每个老师对论文的格式要求不一样&#xff0c;故本论文只供参考&#xff0c;本论文页数达到60页以上&#xff0c;字数在6000及以上。 基于SpringBootVueJS微信小程序技术的图书森林共享小程序设计与实现 目录 基于SpringBootVueJS微信小程序技术的图书森…

自动驾驶-端到端分割任务

上采样 bed of nails interpolation transposed convolutions 1. 上采样 (Upsampling) 上采样是一种技术&#xff0c;用于增加数据集中的样本数量或是提高信号的分辨率。在图像处理中&#xff0c;上采样通常指的是增加图像的像素数量&#xff0c;从而使图像变得更大。这可…

MySQL 中的几种锁

MySQL 中的锁 #按锁粒度如何划分? 按锁粒度划分的话&#xff0c;MySQL 的锁有&#xff1a; 表锁&#xff1a;开销小&#xff0c;加锁快&#xff1b;锁定力度大&#xff0c;发生锁冲突概率高&#xff0c;并发度最低;不会出现死锁。行锁&#xff1a;开销大&#xff0c;加锁慢…

Prometheus 云原生 - 基于 file_sd、http_sd 实现 Service Discovery

目录 开始 为什么需要服务发现机制 File Service Discovery&#xff08;file_sd&#xff09; 基本概念 配置方式 使用案例 HTTP Service Discovery&#xff08;http_sd&#xff09; 基本概念 配置方式 使用案例 开始 为什么需要服务发现机制 我们知道在 Prometheus …

【Linux】:文件fd

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家带来关于文件fd的相关知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通 数据…

Java二十三种设计模式-单例模式(1/23)

引言 在软件开发中&#xff0c;设计模式是一套被反复使用的、大家公认的、经过分类编目的代码设计经验的总结。单例模式作为其中一种创建型模式&#xff0c;确保一个类只有一个实例&#xff0c;并提供一个全局访问点。本文将深入探讨单例模式的概念、实现方式、使用场景以及潜…

C语言 ——— 模拟实现strcpy函数

目录 strcpy函数功能介绍 strcpy函数的模拟实现 strcpy函数功能介绍 学习并使用strcpy函数-CSDN博客 strcpy函数的模拟实现 代码演示&#xff1a; #include<stdio.h> #include<assert.h> char* my_strcpy(char* destination, const char* source) {assert(des…

单目3D和bev综述

文章目录 SOTA2D 检测单目3d检测3d bev cam范式1 Transformer attention is all you need 20172 ViT vision transformer ICLR 2021google3 swin transformer 2021 ICCV bestpaper MS4 DETR 20205 DETR3D 20216 PETR 20227 bevformerLSSbevdetcaddn指标 mAP NDS标注&#xff1a…