当前位置: 首页 > news >正文

MySQL数据库:外键、唯一键、唯一索引

目录

说明

一、如果要使用外键,表的存储引擎选择哪个?

1.1 答

1.2 示范

1.2.1 主表

(1)MyISAM的表:masterTable2

(2)InnoDB的表:masterTable1

1.2.2 从表

(1)外键是MyISAM的表(提示错误)

(2)外键是InnoDB的表(创建成功)

二、外键的主要作用是什么?

三、外键可以为null吗?

四、设置外键跟设置唯一键有什么区别?

五、为何主键和唯一键没建索引,却已有索引?

六、设置外键的列必须设置唯一键吗?

6.1 答

6.2 示范

(1)主表(userId不是唯一键,也不是主键)

(2)从表(创建失败)


说明

(1)下面的所有举例,只要表名一样,就表示是说的同一个表。

(2)mysql版本号

一、如果要使用外键,表的存储引擎选择哪个?

1.1 答

mysql表的存储引擎要是InnoDB。

且外键的两个表存储引擎必须相同。

这是因为MyISAM和InnoDB是MySQL中两种不同的存储引擎。

它们的设计目标和重点不同,MyISAM不支持事务及外键,InnoDB支持事务及外键。

MyISAM的设计目标是快速读取,适用于读取频繁的应用程序。

而InnoDB的设计目标是支持高并发的事务处理,适用于写入频繁的应用程序。

1.2 示范

1.2.1 主表

(1)MyISAM的表:masterTable2

CREATE TABLE masterTable2 (
  id bigint(20) NOT NULL AUTO_INCREMENT,
  userId bigint(20) DEFAULT NULL,
  name varchar(255) DEFAULT NULL,
  phone varchar(20) DEFAULT NULL,
  PRIMARY KEY (id),
  UNIQUE KEY UK_2 (userId)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

查看表数据存储引擎:

SHOW TABLE STATUS LIKE 'mastertable2';

(2)InnoDB的表:masterTable1

CREATE TABLE masterTable1 (
  id bigint(20) NOT NULL AUTO_INCREMENT,
  userId bigint(20) DEFAULT NULL,
  name varchar(255) DEFAULT NULL,
  phone varchar(20) DEFAULT NULL,
  PRIMARY KEY (id),
  UNIQUE KEY UK_1 (userId)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

查看表数据存储引擎:

SHOW TABLE STATUS LIKE 'mastertable1';

1.2.2 从表

(1)外键是MyISAM的表(提示错误)

CREATE TABLE slaveTable (
  id bigint(20) NOT NULL AUTO_INCREMENT,
  userId bigint(20) DEFAULT NULL,
  name varchar(255) NOT NULL,
  phone varchar(20) DEFAULT NULL,
  PRIMARY KEY (id),
  constraint FK_1 foreign key(userId) references masterTable2(userId)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

(2)外键是InnoDB的表(创建成功)

CREATE TABLE slaveTable (
  id bigint(20) NOT NULL AUTO_INCREMENT,
  userId bigint(20) DEFAULT NULL,
  name varchar(255) NOT NULL,
  phone varchar(20) DEFAULT NULL,
  PRIMARY KEY (id),
  constraint FK_1 foreign key(userId) references masterTable1(userId)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

二、外键的主要作用是什么?

保持数据的一致性、完整性。

三、外键可以为null吗?

mysql 数据库 外键允许为 null or 空。

插入数据:

insert into masterTable1 (userId, name, phone) values (1, "1我是谁", 1234);

insert into masterTable1 (userId, name, phone) values (null, "1我是谁", 1234);

insert into slaveTable (userId, name, phone) values (null, "slave1", 1234);

insert into slaveTable (userId, name, phone) values (1, "slave22", 12345);

主表数据:

从表数据,外键有null的情况:

四、设置外键跟设置唯一键有什么区别?

两者是两个内容。

外键:一个表可以有多个列是外键。

唯一键:一个表可以有多个列是唯一键。

五、为何主键和唯一键没建索引,却已有索引?

那是因为MySQL默认在建立主键或者唯一键的时候,就建立了索引。


六、设置外键的列必须设置唯一键吗?

6.1 答

外键在从表中。

外键的建立原则:外键引用的那个列在主表中必须是主键列或者唯一列。

6.2 示范

(1)主表(userId不是唯一键,也不是主键)

CREATE TABLE masterTable3 (
  id bigint(20) NOT NULL AUTO_INCREMENT,
  userId bigint(20) DEFAULT NULL,
  name varchar(255) DEFAULT NULL,
  phone varchar(20) DEFAULT NULL,
  PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

(2)从表(创建失败)

CREATE TABLE slaveTable3 (
  id bigint(20) NOT NULL AUTO_INCREMENT,
  userId bigint(20) DEFAULT NULL,
  name varchar(255) NOT NULL,
  phone varchar(20) DEFAULT NULL,
  PRIMARY KEY (id),
  constraint FK_11 foreign key(userId) references masterTable3(userId)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;


我是程序员娟娟,

致力将工作中遇到的问题和解决方案记录下来,

分享给更多需要的同行。

如果对你有帮助,不妨点个关注吧!

相关文章:

MySQL数据库:外键、唯一键、唯一索引

目录 说明 一、如果要使用外键,表的存储引擎选择哪个? 1.1 答 1.2 示范 1.2.1 主表 (1)MyISAM的表:masterTable2 (2)InnoDB的表:masterTable1 1.2.2 从表 (1&am…...

CSS核心功能手册:从熟悉到精通

CSS核心功能代码 文章目录 CSS核心功能代码[toc]参考HTML代码尺寸操作设置元素尺寸内边距外边距设置默认布局边距用途和使用场景: 背景设置**背景颜色 (background-color)**:**背景图像 (background-image)**:**背景重复 (background-repeat)**:**背景位置 (backgro…...

编程的重要性及解决技术难题的方法

看到这个话题之后,出于好奇,使用某chat,输入相应主题得到的一篇文章,分享给大家。 PS:现在不同版本的chat和其快速更新升级也可以说是编程的结果,其重要性和发展历程也反映了编程的重要性。 一、编程的重要…...

如何成为一名高效的前端开发者(10X开发者)

如今,每个人都想成为我们所说的“10倍开发者”。然而,这个术语经常被误解和高估。 本质上,一个高效或者10倍开发者,在我看来,是指那些能够充分利用所有可用工具的人,通过让这些工具处理冗余和重复的任务&am…...

Docker port 命令

docker port:列出指定的容器的端口映射,或者查找将PRIVATE_PORT NAT到面向公众的端口。 语法 docker port [OPTIONS] CONTAINER [PRIVATE_PORT[/PROTO]]实例 查看容器mymysql的端口映射情况: docker port mymysql##效果如下: …...

PostgreSQL-SQL联表查询LEFT JOIN 数据去重复

我们在使用left join联表查询时,如果table1中的一条记录对应了table2的多条记录,则会重复查出id相同的多条记录。 1、解决方法一 SELECT t1.* FROM table1 t1 LEFT JOIN table2 t2 ON t1.id t2.tid 第一种方法我们发现还是有重复数据 2、解决方法二…...

Golang与MongoDB的完美组合

引言 在现代开发中,数据存储是一个至关重要的环节。随着数据量的增加和复杂性的提高,开发人员需要寻找一种高效、可扩展且易于使用的数据库解决方案。MongoDB作为一种NoSQL数据库,提供了强大的功能和灵活的数据模型,与Golang的高…...

初识Java 18-2 泛型

目录 构建复杂模型 类型擦除 C中的泛型 迁移的兼容性 类型擦除存在的问题 边界的行为 对类型擦除的补偿 创建类型实例 泛型数组 本笔记参考自: 《On Java 中文版》 构建复杂模型 泛型的一个优点就是,能够简单且安全地创建复杂模型。 【例子&am…...

vue分环境打包及案例代码

Vue分环境打包可以帮助我们针对不同的环境(如开发环境、测试环境、生产环境等)打包出不同的版本,以满足不同的需求。下面是一个简单的Vue分环境打包的示例代码: 安装cross-env: npm install --save-dev cross-env在项目的根目录下创建不同的环境配置文件,如test.env.js…...

基于springboot+vue的在线考试系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…...

重装linux后需要做的配置

1. linux中 vim如果输入中文乱码 打开/etc/vim/vimrc输入: set fileencodingsutf-8,gbk set termencodingutf-8 set encodingutf-8 把vim的缩进格式顺便改了 http://t.csdnimg.cn/K3ncc 2. 配置sudo授权用户 3. 新导入项目后 , chmod -R x 添加权限 4. 查询主机i…...

【华为数通HCIP | 网络工程师】821刷题日记-IS-IS(2)

个人名片: 🐼作者简介:一名大三在校生,喜欢AI编程🎋 🐻‍❄️个人主页🥇:落798. 🐼个人WeChat:hmmwx53 🕊️系列专栏:🖼️…...

Linux系统-----进程管理(进程的创建与控制)

目录 前言 进程 1.基本概念 2.特征 3.Linux系统的进程 进程的创建 1. fork()函数 2. 多进程的创建与输出 进程的控制 1. exec()系列 2. wait() 函数 3. execl( )和fork( )联合使用 4. exit( ) 前言 前面我们学习了Linux系统的基本指令以及如…...

Unity 获取物体的子物体的方法

Unity 中要获取物体的子物体,可以使用以下一些方法。 1、只获取一级节点的子物体: public Transform tran;// Start is called before the first frame updatevoid Start(){foreach (Transform child in tran){Debug.Log(child.name);}} 使用该方法只会…...

RocketMQ 读写压测

一、Producer 压测 [rootsz-glbd-mq-108-249 rocketmq-all-5.1.3-bin-release]# sh bin/tools.sh org.apache.rocketmq.example.benchmark.Producer -n 10.XXX.108.249:9876 -t TopicTest_LEXIN_2023_pop_128 -w 64 16:39:18,402 |-INFO in org.apache.rocketmq.logging.ch.qo…...

PHP调用API接口的方法及实现(一键采集淘宝商品详情数据)

随着互联网、云计算和大数据时代的到来,越来越多的应用程序需要调用第三方的API接口来获取数据,实现数据互通和协同工作。PHP作为一种常用的服务器端语言,也可以通过调用API接口来实现不同系统的数据交互和整合。本文将介绍PHP调用API接口的方…...

得物App安卓冷启动优化-Application篇

前言 冷启动指标是App体验中相当重要的指标,在电商App中更是对用户的留存意愿有着举足轻重的影响。通常是指App进程启动到首页首帧出现的耗时,但是在用户体验的角度来看,应当是从用户点击App图标,到首页内容完全展示结束。 将启…...

【实战教程】PHP与七牛云的完美对接

前言: 随着互联网的迅速发展,越来越多的网站和应用程序需要处理大量的图片、视频和其他文件。为了有效地存储和管理这些文件,并提供快速的内容分发服务,开发者们常常依赖于云存储和CDN服务提供商。 七牛云是一家领先的云存储和C…...

Go 接口:nil接口为什么不等于nil?

一、Go 接口的地位 Go 语言核心团队的技术负责人 Russ Cox 也曾说过这样一句话:“如果要从 Go 语言中挑选出一个特性放入其他语言,我会选择接口”,这句话足以说明接口这一语法特性在这位 Go 语言大神心目中的地位。 为什么接口在 Go 中有这么…...

(UM1724) STM32 Nucleo-64 boards User manual

STM32 Nucleo-64 评估板用户手册 0. 前言1. 介绍[^1]2. Ordering information2.1 包装编号说明3. 开发环境4. 跳线端子 ON/OFF 的约定5. 快速入门6. 硬件布局与配置6.10 扩展连接器6.11 ARDUINO 连接器6.12 ST morpho 连接器7. Nucleo-64 评估板信息0. 前言 【相关博文】 【STM…...

Python 直驱打印机:从字体精调到标签排版,实战避坑指南

1. 为什么选择Python直驱打印机? 很多开发者第一次听说用Python直接控制打印机时都会觉得不可思议——毕竟我们习惯了通过Word、PDF等中间软件来打印文档。但当你需要批量生成标签贴、定制化报表或者自动化打印任务时,传统方式的弊端就暴露无遗&#xff…...

智能家居中枢:OpenClaw桥接Qwen3.5-9B实现语音控制图片检索

智能家居中枢:OpenClaw桥接Qwen3.5-9B实现语音控制图片检索 1. 为什么需要智能家居中的图片检索 每次家庭聚会后整理照片都让我头疼。手机相册里堆积着上千张照片,当亲友们围坐在客厅想回顾某次旅行时,"找那张在雪山前跳起来的合影&qu…...

GX Works2编程避坑指南:PLC数据传输指令(MOV/FMOV/BMOV)的5个常见错误与正确写法

GX Works2编程避坑指南:PLC数据传输指令的5个致命陷阱与工业级解决方案 在自动化产线的深夜调试现场,一个看似简单的MOV指令错误可能导致整条生产线异常停机——这种场景对PLC工程师来说绝不陌生。三菱GX Works2作为工业控制领域的标杆软件,其…...

C语言实现进程调度算法:优先级与时间片轮转

1. 项目概述在嵌入式系统和操作系统开发中,进程调度是一个核心概念。今天我要分享的是如何在C语言中实现一个简单的程序调度机制,重点讲解高优先数调度算法和先来先服务算法的实现。这个项目非常适合想要深入理解操作系统底层原理的开发者,特…...

电子工程师必读:假芯片识别与防范全指南

1. 芯片造假现象深度解析作为一名在电子行业摸爬滚打十余年的工程师,我见过太多因为假芯片导致的惨痛教训。记得2018年我们团队做一个工业控制器项目,就因为一批假冒的STM32芯片导致整批产品返工,直接损失超过50万元。这件事让我深刻意识到&a…...

08_微服务划分与团队人数之监控治理与跨团队协作

微服务划分与团队人数之监控治理与跨团队协作 体系内容 可观测性三支柱:指标、日志、链路追踪 治理要素:SLO、Dashboard、告警分级、容量视图、契约审计 Spring Cloud Alibaba 关联:Nacos、Sentinel、Gateway、RocketMQ、Dubbo 与观测平台协同 跨团队机制:接口契约、消息契…...

Flutter Provider:简单而强大的状态管理

Flutter Provider:简单而强大的状态管理告别 setState 的混乱,拥抱 Provider 的简洁优雅。一、Provider 的核心价值 作为一名追求代码如散文般优雅的 UI 匠人,我对状态管理工具有着严格的要求。Provider 不仅解决了 Flutter 中的状态共享问题…...

MTKClient技术内幕:从硬件交互到场景落地的深度探索

MTKClient技术内幕:从硬件交互到场景落地的深度探索 【免费下载链接】mtkclient MTK reverse engineering and flash tool 项目地址: https://gitcode.com/gh_mirrors/mt/mtkclient 一、技术原理解析:MTKClient如何与硬件对话 MTKClient的核心能…...

物联网设备上高德地图离线地图加载慢?5秒内快速加载的终极解决方案

物联网设备高德地图离线加载优化实战:从2分钟到5秒的进阶方案 在智能电表、车载终端、工业传感器等物联网设备中,离线地图的快速加载直接影响着用户体验与系统响应效率。我们曾遇到一个典型场景:某共享单车智能锁通过4G模块上报位置时&#x…...

计算机毕业设计:Python地铁线路客流与票价数据可视化系统 Django框架 数据分析 可视化 大数据 机器学习 深度学习(建议收藏)✅

博主介绍:✌全网粉丝50W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战8年之久,选择我们就是选择放心、选择安心毕业✌ > 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与…...