外键约束

目录

外键约束

对数据表进行初期设计,暂时不使用外键

验证限制三

验证级联删除

设置级联更新


Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645

外键约束

外键约束主要是在父子表关系中体现的一种约束操作。

下面通过一个具体的操作来观察一下为什么会有外键约束的存在。

例如,现在希望描述一种概念,两个人有多本书,如果要设计表就需要设计两张数据表

对数据表进行初期设计,暂时不使用外键

-- 删除数据表
DROP TABLE member PURGE ;
DROP TABLE book PURGE ;
-- 创建数据表
CREATE TABLE member(
	mid    NUMBER 	,
	name    VARCHAR2(20) ,
	CONSTRAINT pk_mid PRIMARY KEY(mid) 
) ;
CREATE TABLE book(
	bid		NUMBER ,
	title		VARCHAR2(20) ,
	mid		NUMBER 
) ;

上面这段代码创建两个数据表,member 和 book 数据表,下面分别向这两张表增加一些数

INSERT INTO member(mid,name) VALUES (1,'张三') ;
INSERT INTO member(mid,name) VALUES (2,'李四') ;
INSERT INTO book(bid,title,mid) VALUES (10,'Java开发',1) ;
INSERT INTO book(bid,title,mid) VALUES (11,'Oracle开发',1) ;
INSERT INTO book(bid,title,mid) VALUES (12,'Android开发',2) ;
INSERT INTO book(bid,title,mid) VALUES (13,'Object-C开发',2) ;

但是此时,也有可能会增加如下信息


INSERT INTO book(bid,title,mid) VALUES (20,'精神病防治',9) ;

此时 member 表中并没有编号为 9 的成员信息

但是由于此时没有设置所谓的约束,所以即使现在父表(member)中不存在对应的编号,那么子表也可以使用,这就是一个错误

实际上也就发现了,book 表中的 mid 列的内容的取值应该由 member 表中的 mid 列所决定,所以现在就可以利用外键约束来解决此类问题

在设置外键约束的时候必须要设置指定的外键列(book.mid列)需要与哪张表的哪个列有关联

-- 删除数据表
DROP TABLE member PURGE ;
DROP TABLE book PURGE ;
-- 创建数据表
CREATE TABLE member(
	mid		NUMBER 	,
	name		VARCHAR2(20) ,
	CONSTRAINT pk_mid PRIMARY KEY(mid) 
) ;
CREATE TABLE book(
	bid		NUMBER ,
	title		VARCHAR2(20) ,
	mid		NUMBER  ,
	CONSTRAINT fk_mid FOREIGN KEY(mid) REFERENCES member(mid)
) ;

上面的代码中,在 member 表中创建了一个主键字段 mid,在 book 表中 mid 字段创建了外键

这个外键和 member 数据表中字段 mid 建立关联,此时 book.mid 列的内容取值范围由 member.mid 列所决定。如果内容正确,则可以保存。

此时可以和前面所述一样,分别向两个表中插入数据

INSERT INTO member(mid,name) VALUES (1,'张三') ;
INSERT INTO member(mid,name) VALUES (2,'李四') ;
INSERT INTO book(bid,title,mid) VALUES (10,'Java开发',1) ;
INSERT INTO book(bid,title,mid) VALUES (11,'Oracle开发',1) ;
INSERT INTO book(bid,title,mid) VALUES (12,'Android开发',2) ;
INSERT INTO book(bid,title,mid) VALUES (13,'Object-C开发',2) ;

如果此时增加错误的数据,来看一下会出现什么情况。向数据表 book 中增加错误的数据,member.mid 没有为 9 的数据

INSERT INTO book(bid,title,mid) VALUES (20,'精神病防治',9) ;

那么此时会出现如下错误信息

ORA-02291: 违反完整约束条件 (SCOTT.FK_MID) - 未找到父项关键字

所谓的外键,就相当于子表中的某一个字段的内容由父表来决定其具体的数据范围。

对外键而言,比较麻烦的是它存在有许多限制。限制一:在删除父表时,需要先删除掉它所对应的全部子表。

member 是父表,book 是子表,如果说现在 book 表没有删除,那么 member 表就无法删除

drop table member;

使用上面代码会出现如下错误信息

ORA-02449: 表中的唯一 / 主键被外键引用

所以需要改变删除顺序

drop table member;
drop table member;

但是有些时候,一些数据库设计者,将 A 表作为 B 表的父表,B 表也同时设置为 A 表的父表,于是就都删不掉了。

为此,在 Oracle 里面专门提供了一个强制删除父表的操作,删除之后不关心子表

drop table member cascade constraint;

此时将强制删除 member 表,但子表不会被删除。但是从实际开发来说,尽量还是按照先后顺序删除。

限制二:如果要作为子表外键的父表列,那么这个列必须设置唯一约束或主键约束。

例如,上面的范例中 member 表中 mid 列被设置成主键约束。

限制三:如果现在主表中某一行数据有对应的子表数据,那么必须先删除子表中的全部数据之后才可以删除父表中的数据。

下面通过一个范例,来理解这个限制的真实意义

验证限制三

首先运行下面代码,建立数据表,并向数据表中插入数据

-- 删除数据表
DROP TABLE book PURGE ;
DROP TABLE member PURGE ;
-- 创建数据表
CREATE TABLE member(
	mid		NUMBER 	,
	name		VARCHAR2(20) ,
	CONSTRAINT pk_mid PRIMARY KEY(mid)
) ;
CREATE TABLE book(
	bid		NUMBER ,
	title		VARCHAR2(20) ,
	mid		NUMBER  ,
	CONSTRAINT fk_mid FOREIGN KEY(mid) REFERENCES member(mid)
) ;
INSERT INTO member(mid,name) VALUES (1,'张三') ;
INSERT INTO member(mid,name) VALUES (2,'李四') ;
INSERT INTO book(bid,title,mid) VALUES (10,'Java开发',1) ;
INSERT INTO book(bid,title,mid) VALUES (11,'Oracle开发',1) ;
INSERT INTO book(bid,title,mid) VALUES (12,'Android开发',2) ;
INSERT INTO book(bid,title,mid) VALUES (13,'Object-C开发',2) ;

运行上面的代码后,可以观察到,member 和 book 数据表中都有 mid 为 1 的数据,即 member 和book 表中有对应的关联

运行下面的删除语句

DELETE FROM member WHERE mid=1 ;

这时会出现如下错误信息

ORA-02292: 违反完整约束条件 (SCOTT.FK_MID) - 已找到子记录

发生这种错误是由于 book 表中有子记录,所以父表的记录就无法删除了。

如果说现在不想受到子记录的困扰,那么就可以使用级联操作。

级联的关系有两种:级联删除、级联更新。级联删除:在父表数据已经被删除的情况下,自动删除其对应子表的数据。

在定义外键的时候使用 ON DELETE CASCADE 即可

验证级联删除

-- 删除数据表
DROP TABLE book PURGE ;
DROP TABLE member PURGE ;
-- 创建数据表
CREATE TABLE member(
	mid		NUMBER 	,
	name		VARCHAR2(20) ,
	CONSTRAINT pk_mid PRIMARY KEY(mid)
) ;
CREATE TABLE book(
	bid		NUMBER ,
	title		VARCHAR2(20) ,
	mid		NUMBER  ,
	CONSTRAINT fk_mid FOREIGN KEY(mid) REFERENCES member(mid) ON DELETE CASCADE
) ;

INSERT INTO member(mid,name) VALUES (1,'张三') ;
INSERT INTO member(mid,name) VALUES (2,'李四') ;
INSERT INTO book(bid,title,mid) VALUES (10,'Java开发',1) ;
INSERT INTO book(bid,title,mid) VALUES (11,'Oracle开发',1) ;
INSERT INTO book(bid,title,mid) VALUES (12,'Android开发',2) ;
INSERT INTO book(bid,title,mid) VALUES (13,'Object-C开发',2) ;

 在上面代码中,在 book 数据表中定义外键的时候,使用了“ON DELETE CASCADE”。运行下面的删除语句

DELETE FROM member WHERE mid=1 ;

我们可以看到,此时当删除了父表数据之后,子表数据会同时删除掉。

级联更新:如果删除父表数据的时候,不想子表含有关联数据的记录也同时被删除掉,但是这时外键字段的值没有对应的关联数据了,那么对应的子表数据的外键字段就可以设置为 null。这种结果可以使用 ON DELETE SET NULL 设置

设置级联更新

-- 删除数据表
DROP TABLE book PURGE ;
DROP TABLE member PURGE ;
-- 创建数据表
CREATE TABLE member(
	mid		NUMBER 	,
	name		VARCHAR2(20) ,
	CONSTRAINT pk_mid PRIMARY KEY(mid)
) ;
CREATE TABLE book(
	bid		NUMBER ,
	title		VARCHAR2(20) ,
	mid		NUMBER  ,
	CONSTRAINT fk_mid FOREIGN KEY(mid) REFERENCES member(mid) ON DELETE SET NULL
) ;

INSERT INTO member(mid,name) VALUES (1,'张三') ;
INSERT INTO member(mid,name) VALUES (2,'李四') ;
INSERT INTO book(bid,title,mid) VALUES (10,'Java开发',1) ;
INSERT INTO book(bid,title,mid) VALUES (11,'Oracle开发',1) ;
INSERT INTO book(bid,title,mid) VALUES (12,'Android开发',2) ;
INSERT INTO book(bid,title,mid) VALUES (13,'Object-C开发',2) ;

 此时如果运行语句“DELETE FROM member WHERE mid=1”,那么 member 中所有符合条件“mid=1”的行都会被删除掉,

但是对应子表 book 中原先对应的 mid=1 都会更新为 null

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

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

相关文章

【C++】string 类---字符判断与大小写转换(超详细解析!)

目录 一、string 类的介绍 二、字符大小写转换与判断常用函数 💦 字符大小写判断 ① isalpha() ② isalnum() ③ isdigit() ④ islower() ⑤ isupper() 💦 字符大小写转换 ① tolower() ✨方法一: ✨方法二: ② toupper() ✨方…

实现:mysql-5.7.42 到 mysql-8.2.0 的升级(二进制方式)

实现:mysql-5.7.42 到 mysql-8.2.0 的升级(二进制方式) 1、操作环境1、查看当前数据库版本2、操作系统版本3、查看 Linux 系统上的 glibc(GNU C 库)版本(**这里很重要,要下载对应的内核mysql版本…

Java之全体集合!

介绍 容器,就是可以容纳其他Java对象的对象。Java Collections Framework(JCF)为Java开发者提供了通用的容器,其始于JDK 1.2.优点是: 降低编程难度提高程序性能提高API间的互操作性降低学习难度降低设计和实现相关API的难度增加程序的重用性 Java容器里…

JavaSE-09笔记【异常(+2024新)】

文章目录 1. 异常概述2.异常继承结构2.1 编译时异常和运行时异常区别2.2 如何让异常发生(throw关键字) 3.自定义异常4.异常的处理4.1 第一种处理方式:声明异常 (throws关键字)4.2 第二种处理方式:捕捉异常 …

Go语言之函数、方法、接口

一、函数 函数的基本语法: func 函数名(形参列表)(返回值列表) {执行语句...return 返回值列表 } 1.形参列表:表示函数的输入 2.函数中的语句:表示为了实现某一功能的代码块 3.函数可以有返回…

SpringBoot集成WebService

1&#xff09;添加依赖 <dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-spring-boot-starter-jaxws</artifactId><version>3.3.4</version><exclusions><exclusion><groupId>javax.validation<…

[蓝桥杯 2023 省 B] 飞机降落(暴搜DFS+贪心)

总结&#xff1a;为什么你看到题想不出来怎么写呢&#xff0c;我想不到这道题还会用到dfs的思想&#xff0c;顶多能知道可能会有贪心&#xff0c;还是得多做题。 这道题让我想起来导弹拦截和借教室&#xff0c;记得有空做做&#xff01;&#xff01;不要研究难题&#xff0c;把…

蓝桥杯--完全二叉树

import java.util.Scanner;import static java.lang.Math.log;public class top9 {//求树的每一层的和public static void main(String [] args){Scanner scannernew Scanner(System.in);int nscanner.nextInt();int [] arrnew int[n];for(int i0;i<n;i){arr[i]scanner.next…

超快速排序(蓝桥杯,归并排序,acwing)

题目描述&#xff1a; 在这个问题中&#xff0c;您必须分析特定的排序算法----超快速排序。 该算法通过交换两个相邻的序列元素来处理 n 个不同整数的序列&#xff0c;直到序列按升序排序。 对于输入序列 9 1 0 5 4&#xff0c;超快速排序生成输出 0 1 4 5 9。 您的任务是确…

英伟达深夜放王炸|字节跳动游戏之路波折不断|文旅短剧风口将至|25岁QQ魅力不减,5亿人在用|云计算市场疯长152%|电商巨头齐瞄向富足悠闲银发族

新闻一分钟速览 文旅短剧风口将至&#xff0c;一地狂拍十部&#xff0c;影视界看法分歧&#xff0c;悬念丛生&#xff01;字节跳动游戏之路波折不断&#xff0c;能否逆风翻盘引关注。折叠屏手机痛症治愈&#xff0c;实力席卷高端市场&#xff0c;势头强劲&#xff01;雷军豪言…

12|检索增强生成:通过RAG助力鲜花运营

什么是 RAG&#xff1f;其全称为 Retrieval-Augmented Generation&#xff0c;即检索增强生成&#xff0c;它结合了检 索和生成的能力&#xff0c;为文本序列生成任务引入外部知识。RAG 将传统的语言生成模型与大规模 的外部知识库相结合&#xff0c;使模型在生成响应或文本时可…

014 Linux_同步

​&#x1f308;个人主页&#xff1a;Fan_558 &#x1f525; 系列专栏&#xff1a;Linux &#x1f339;关注我&#x1f4aa;&#x1f3fb;带你学更多操作系统知识 文章目录 前言一、死锁&#xff08;1&#xff09;死锁概念 二、同步&#xff08;1&#xff09;同步概念&#xff…

Python入门(小白友好)

知识图谱 搭建环境 安装Python:Download Python | Python.org 安装PyCharm:Download PyCharm: The Python IDE for data science and web development by JetBrains 注意:专业版本是收费的,新手小白使用社区版(community)即可 创建第一个项目: 一些PyCharm的设置(也适用…

40年创新蝶变,IBM与中国共创新质生产力

2024年是“新质生产力”进入政府工作报告第一年&#xff0c;也是百年追求科技创新的IBM在华40周年&#xff0c;同时IBM全球正全力打造下一代企业生产力平台——突破性的企业混合云与AI。2023年&#xff0c;IBM推出基于开源混合云平台Red Hat Openshift的下一代企业级数据和AI平…

显隐特征融合的指静脉识别网络

文章目录 显隐特征融合的指静脉识别网络总结摘要介绍显隐式特征融合网络(EIFNet)掩膜生成模块(MGM)掩膜特征提取模块(MFEM)内容特征提取模块(CFEM)特征融合模块(FFM) THUFVS实验和结果数据集实现细节评估掩膜生成模型消融实验FFM模块门控层Batch Size损失函数超参数选择 论文 …

Python学习从0到1 day17 Python异常、模块、包

不走心的努力&#xff0c;都是在敷衍自己 ——24.3.19 万字长文&#xff0c;讲解异常、模块、包&#xff0c;看这一篇就足够啦 什么是异常? 当检测到一个错误时&#xff0c;python解释器就无法继续执行了&#xff0c;反而出现了一些错误的提示&#xff0c;这就是所谓的异常&am…

解决重装系统之后,开始菜单找不到Anaconda3相关图标

一、anaconda3安装后在开始菜单找不到&#xff0c;如下图所示 二、进入Anaconda3安装的位置 在安装位置按住shift键鼠标右键&#xff0c;打开poworshell&#xff0c;输入 start cmd最后的结果如图。

联发科MT8797迅鲲1300T规格参数_MTK5G安卓核心板方案定制

联发科MT8797&#xff08;迅鲲1300T&#xff09;平台采用Arm Cortex-A78和Cortex-A55组成的八核架构CPU&#xff0c;以及Arm Mali-G77MC9九核GPU&#xff0c;集成了AI处理器MediaTek APU&#xff0c;支持5G Sub-6GHz全频段和5G双载波聚合,支持1.08亿像素拍照和多镜头组合,以及1…

docker入门(五)—— 小练习,docker安装nginx、elasticsearch

练习 docker 安装 nginx # 搜素镜像 [rootiZbp15293q8kgzhur7n6kvZ home]# docker search nginx NAME DESCRIPTION STARS OFFICIAL nginx …

模拟面试

1.TCP通信中的三次握手和四次挥手过程 三次握手 1.客户端像向服务器端发送连接请求 2.服务器应答连接请求 3.客户端与服务器简历连接 四次挥手&#xff1a; 客户端或服务器端发起断开请求,这里假设客户端发送断开请求 1.客户端向服务器发送断开请求 2.服务器应答断开请求 3.服…