外键约束

目录

外键约束

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

验证限制三

验证级联删除

设置级联更新


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

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

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

相关文章

代码随想录算法训练营day28 | 回溯算法之93.复原IP地址 78.子集 90.子集II

三刷day28 93.复原IP地址判断子串是否合法 78.子集回溯三部曲 90.子集II 93.复原IP地址 题目链接 解题思路: 切割问题就可以使用回溯搜索法把所有可能性搜出来 回溯三部曲 递归参数 startIndex一定是需要的,因为不能重复分割,记录下一层递…

windows取证

Windows事件日志分析 使用Windows事件日志查看器,打开实验文档“security01.evtx”。按“日期和时间”对日志进行分组统计;按“事件ID”对日志进行分组统计: 问题:日志中是否有用户登录失败的记录。如果有,请按“登录…

AI智能客服的数据训练流程

实现智能客服的数据训练流程可以分为几个主要步骤,包括数据准备、模型选择、模型训练和评估。以下是一个基本的数据训练流程,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1.数据准备&am…

1-postgresql数据库高可用脚本详解

问题: pgrep -f postgres > /dev/null && echo 0 || pkill keepalived 这是什么意思 建议换成 pgrep -f postmaster > /dev/null && echo 0 || pkill keepalived 回答 这条命令是一个复合命令,包含条件执行和重定向的元素。让我们…

三、转移字符、字符串、bool类型和eval函数

一、转义字符 \n:换行符 \t:制表符 \:单引号 \":双引号 \\:反斜杠 a人生无常 b我用python print(ab) print(f"{a}\n{b}") print(f"{a}\t{b}") print(fr"{a}\t{b}") 在打印字…

const,static深度总结——c++穿透式分析

前言;c类和对象的知识点中除了几种默认函数, 比较重要的还有使用const和static修饰成员相关知识点。const在c中特性很简单。 但是在使用中, 比较容易疏忽大意出现问题。 static特性也很简单, 但是比起const来要直接的多。 在使用中…

LAMP架构部署--yum安装方式

这里写目录标题 LAMP架构部署web服务器工作流程web工作流程 yum安装方式安装软件包配置apache启用代理模块 配置虚拟主机配置php验证 LAMP架构部署 web服务器工作流程 web服务器的资源分为两种,静态资源和动态资源 静态资源就是指静态内容,客户端从服…

如何选择合适的奶瓶?五大超实用选购技巧,新手宝妈必看

奶瓶什么品牌好?奶瓶是每个新生宝宝都需要用到的辅喂产品,然而市场上许多网红品牌为了赚快钱,往往凭借外观设计、性价比和广告营销来吸引消费者。这些品牌由于缺乏专业技术,往往没有对选材用料和安全性进一步的优化,从…

MNN Session::resize 之流水线编码(五)

系列文章目录 MNN createFromBuffer(一) MNN createRuntime(二) MNN createSession 之 Schedule(三) MNN createSession 之创建流水线后端(四) MNN Session::resize 之流水线编码&am…

【LeetCode: 173. 二叉搜索树迭代器 + dfs + 二叉搜索树】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

电脑数据安全新利器:自动备份文件的重要性与实用方案

一、数据安全的守护神:自动备份文件的重要性 在数字化时代,电脑中的文件承载着我们的工作成果、个人回忆以及众多重要信息。然而,数据丢失的风险无处不在,无论是硬件故障、软件崩溃,还是恶意软件的攻击,都…

Python计算机二级选择易错题(一)

题目来源:python计算机二级真题(选择题) - 知乎 选择题第08,09套

力扣刷题Days22-49.字母异位词(js)

目录 1,题目 2,代码 2.1利用数组排序作为键名 2.2计数实现 3,学习与总结 1,题目 给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到…

虚拟化技术

前言 大家好我是jiantaoyab,这是我所总结作为学习的笔记第十八篇,在这里分享给大家,这篇文章讲虚拟技术就是大家平时用到的云服务器是什么。 虚拟机技术变迁 虚拟机(Virtual Machine)技术,其实就是指在现…

关于Oracle Primavera P6 v23.12新增的特殊功能

​​​​​​​ 本文将介绍Oracle Primavera P6 最新发行版v23.12 中有新增哪些特色功能 1.角色限制计算的细化 如果选择显示根据主要资源限制计算的角色限制,你可以选择在“用户首选项”的“资源分析”选项卡上仅使用 P6 Professional 中的活动资源来计算限制。…

Spring-Gateway服务网关

一、网关介绍 1. 为什么需要网关 Gateway网关是我们服务的守门神,所有微服务的统一入口。 网关的核心功能特性: 请求路由 权限控制 限流 架构图: 权限控制:网关作为微服务入口,需要校验用户是是否有请求资格&am…

高端嵌入式底层技术揭秘:《ARM汇编与逆向工程》

ARM架构简介 与传统的CISC(Complex Instruction Set Computer,复杂指令集计算机)架构相比,Arm架构的指令集更加简洁明了,指令执行效率更高,能够在更低的功耗下完成同样的计算任务,因此在低功耗…

el-dialog弹框遮罩层问题

先看一下出现的bug,点击按钮出现弹框的时候,遮罩层出现在弹框上层,不知道是那个同事写的全局样式影响的,这个时候我们需要在el-dialog标签上添加一个属性就行 :modal-append-to-body“false” 下图是出现的问题,遮罩层…

[论文笔记] Dual-Channel Span for Aspect Sentiment Triplet Extraction

一种利用句法依赖和词性相关性信息来过滤噪声(无关跨度)的基于span方法。 会议EMNLP 2023作者Pan Li, Ping Li, Kai Zhang团队Southwest Petroleum University论文地址https://aclanthology.org/2023.emnlp-main.17/代码地址https://github.com/bert-ply…

MySQL数据自动同步到Es

Logstash 测试数据准备 DROP DATABASE IF EXISTS es;CREATE DATABASE es DEFAULT CHARACTER SET utf8;USE es;CREATE TABLE book (id INT NOT NULL,title VARCHAR(20),author VARCHAR(20),price DECIMAL(6,2),PRIMARY KEY(id) );DROP PROCEDURE IF EXISTS batchInsertBook;DELI…