MySQL - 数据库级别的外键

news2024/12/23 6:23:25

1. 外键 FOREIGN KEY (了解)

测试数据 :

学生表

CREATE TABLE IF NOT EXISTS `student` (
	`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT  '学号',
	`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
	`pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
	`sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',
	`birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
	`gradeid` INT(10) NOT NULL COMMENT '学生的年级',
	`address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
	`email` VARCHAR(50)  DEFAULT NULL COMMENT '邮箱',
	PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;

年级表

CREATE TABLE `grade`(
	`gradeid` INT(10) NOT NULL AUTO_INCREMENT COMMENT '年级id',
	`gradename` VARCHAR(50) NOT NULL COMMENT '年级名称',
	PRIMARY KEY(`gradeid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;

 学生表的 grade 列引用年级表的 id (外键约数) : 

2. 设置外键的两种方式 

2.1 建表时增加约束

  • 定义外键 key
  • 给这个外键添加约束 (执行引用) references 引用
CREATE TABLE IF NOT EXISTS `student` (
	`id` INT(4) NOT NULL AUTO_INCREMENT COMMENT  '学号',
	`name` VARCHAR(30) NOT NULL DEFAULT '匿名' COMMENT '姓名',
	`pwd` VARCHAR(20) NOT NULL DEFAULT '123456' COMMENT '密码',
	`sex` VARCHAR(2) NOT NULL DEFAULT '女' COMMENT '性别',
	`birthday` DATETIME DEFAULT NULL COMMENT '出生日期',
	`gradeid` INT(10) NOT NULL COMMENT '学生的年级',
	`address` VARCHAR(100) DEFAULT NULL COMMENT '家庭住址',
	`email` VARCHAR(50)  DEFAULT NULL COMMENT '邮箱',
	PRIMARY KEY(`id`),
	KEY `FK_gradeid` (`gradeid`)
	CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`) REFERENCES `grade`(`gradeid`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;

2.2 建表成功后添加外键约束

ALTER TABLE `student`
ADD CONSTRAINT `FK_gradeid` FOREIGN KEY(`gradeid`) 
REFERENCES `grade`(`gradeid`);

-- ALTER TABLE 表名 ADD CONSTRAINT 约束名 
-- FOREIGN KEY(作为外键的列) REFERENCES 哪个表(哪个字段)

【注意】 

   当我们给表添加上外键后, 我们想要删除有外键关系的表的时候, 必须要先删除引用别人的表 (从表), 再删除被引用的表 (主表). 

对于上述外键的学习, 以上操作都是物理外键, 也就是数据库级别的外键, 我们不建议使用. 为了避免数据过多造成困扰. 所以只需要了解即可. 并且很多人在工作中确实也不会使用外键. 包括阿里的 Java 规范中也给出这样一句话 :

【强制】不得使用外键与级联, 一切外键概念必须在应用层解决.

外键的最佳实践

  • 数据库就是单纯的表, 只用来存储数据, 只有 行(数据) 和 列(字段).
  • 我们想使用多张表的数据, 想使用外键的时候, 在应用层去实现, 也就是使用程序实现.

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

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

相关文章

在 Mac 上安装 K8S

本篇文章将介绍如何在 Mac 上使用 minikube 搭建单机版的 Kubernetes。 安装步骤 安装 Docker 安装 docker 主要是用于提供容器引擎。直接下载安装即可。 下载地址 安装 Kubectl 推荐使用 home brew 安装 brew install kubectl可以使用下面的命令查看是否已经安装完毕 …

MAYA粒子圈

无法修改 完成一圈的时间

【C51】基于51单片机的自动输液监控系统设计与实现

摘 要 随着科技进步,我国的医疗设施不断完善,逐渐达到现代化水平。在当今的医疗环境下,病患更关心自己是否能够及时进行有效的治疗,医护人员对患者进行输液过程的全程监控。医生治疗的效果明显提高,不仅节约大量的时间…

Linux: 进程管理

一,快速上手,结束一个失控的进程 在主目录中,用文本编辑器创建一个文本文件badpro,如下: #! /bin/bash while echo "Im making files!!" domkdir adircd adirtouch afilesleep 2s done将该文件设定为可执行…

Leetcode 刷题 动态规划 子序列问题

300. 最长递增子序列 首先明确什么是子序列 子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序 不一定要连续 可以删除部分元素 但是要保证相对顺序 1. dp[i]的定义 dp[i]表示i之前包括i的以nums[i]结尾的最长…

Hutool 30

Hutool是一个Java工具包,提供了丰富的工具类库和简化开发的工具方法。它的目标是提供一套丰富、实用、高效和易用的Java工具类,以提升开发者的开发效率和开发质量。以下是Hutool的一些主要特点和功能模块: 常用工具类:Hutool提供了…

【Linux | Shell命令】bash shell 进程、磁盘、排序命令

目录 一、概述二、进程相关命令2.1 ps 命令 三四五 一、概述 上篇文章 bash shell 基础命令 中,介绍了一些与目录、文件相关的 shell 命令,本文继续介绍其他与进程、磁盘、排序、归档相关的命令,读者可以在自己的Linux系统下,实操…

【AI赋能未来】一文带你了解生成对抗网络(GAN)

自我介绍⛵ 📣我是秋说,研究人工智能、大数据等前沿技术,传递Java、Python等语言知识。 🙉主页链接:秋说的博客 📆 学习专栏推荐:MySQL进阶之路、C刷题集、网络安全攻防姿势总结 欢迎点赞 &…

shiro框架 02使用shiro进行用户的认证

01.shiro框架的具体业务: 具体的内部结构: Subject(主体):与软件交互的一个特定的实体(用户、第三方服务等)。 SecurityManager(安全管理器) :Shiro 的核心,用来协调管理组件工作。 其中的: Au…

小研究 - Java 指针分析综述(二)

近年来静态程序分析已成为保障软件可靠性、安全性和高效性的关键技术之一. 指针分析作为基 础程序分析技术为静态程序分析提供关于程序的一系列基础信息,例如程序任意变量的指向关系、变量 间的别名关系、程序调用图、堆对象的可达性等. 介绍了 Java 指针分析的重要…

亚马逊云科技积极探索多样化生态合作模式,助力实现可持续发展愿景

2023年6月26日,亚马逊云科技中国峰会在上海世博中心盛大开幕!以主题“因构建 而可见”为大家拉开帷幕。当前,越来越多的企业客户,以及当地政府监管机构对企业的要求,都需要企业告知碳足迹,亚马逊云科技提供…

优盘数据恢复怎么做?3个方法分享!

我的优盘里保存了很多有纪念意义的照片,但是刚刚将u盘插入电脑后,发现有些照片已经损坏了。我想将优盘里的数据恢复,有什么靠谱的方法吗?给我推荐一下吧! 优盘是一种便携式存储设备,常用于存储和传输数据。…

Java-API简析_java.lang.Thread类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://blog.csdn.net/m0_69908381/article/details/131467981 出自【进步*于辰的博客】 因为我发现目前,我对Java-API的学习意识比较薄弱…

九类AI应用和五个简单LLM的Prompt技巧

一、九类AI应用 AI艺术:造梦日记、MidJourney、Stable Diffusion、Adobe、Stability、Remove AI聊天:ChatGPT、Discord、文心一言、Google Bard、星火、Character.Al AI社区:Kaggle、Hugging Face、H20、Github、Replicate、OpenCV AI创造…

chatgpt赋能python:Python随机打乱列表:如何使用Python打乱您的数据?

Python随机打乱列表:如何使用Python打乱您的数据? 在数据处理中,列表是一种常见的数据结构。然而,当数据量很大时,列表的排序方式也变得重要。为了更好地处理数据,我们需要知道如何使用Python打乱列表。 …

k8s操作命令

系列文章目录 文章目录 系列文章目录一、k8s基础命令1.陈述式资源管理方法:2.基础命令 总结 一、k8s基础命令 1.陈述式资源管理方法: 1.kubernetes 集群管理集群资源的唯一入口是通过相应的方法调用 apiserver 的接口 2.kubectl 是官方的CLI命令行工具…

项目——学生信息管理系统2

目录 用户类型,我们创建一个枚举类 在 org.xingyun.model 包下创建 UserType 枚举类 快速生成 get set 方法 修改代码,下拉框的内容,用我们的枚举类型 给登录按钮绑定事件 我们在 org.xingyun.utils 包下创建一个工具类 Eclipse 智能提…

【Java基础】volatile关键字

关于作者:CSDN内容合伙人、技术专家, 从零开始做过日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。 目录 一、导读二、概览2.1 作用2.2 多线程共享变量的访问流程2.3 多线…

EMC学习笔记(十二)跨分割区及开槽的处理

跨分割区及开槽的处理 1.开槽的产生1.1 对电源/地平面分割造成的开槽1.2 通孔过于密集形成开槽 2.开槽对PCB板EMC性能的影响2.1 高速信号与低速信号的面电流分布2.2 分地的概念2.3 信号跨越电源平面或地平面上的开槽的问题 3.对开槽的处理3.1 需要严格的阻抗控制的高速信号线&a…

基于Hadoop的豆瓣电影的数据抓取、数据清洗、大数据分析(hdfs、flume、hive、mysql等)、大屏可视化

目录 项目介绍研究背景国内外研究现状分析研究目的研究意义研究总体设计数据获取网络爬虫介绍豆瓣电影数据的采集 数据预处理数据导入及环境配置Flume介绍Hive介绍MySQL介绍Pyecharts介绍环境配置及数据加载 大数据分析及可视化豆瓣影评结构化分析豆瓣电影类型占比分析豆瓣电影…