外键约束

目录

外键约束

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

验证限制三

验证级联删除

设置级联更新


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.rhkb.cn/news/279709.html

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

相关文章

matlab 基于小波变换的油气管道泄露信号检测

1、内容简介 略 71-可以交流、咨询、答疑 基于小波变换的油气管道泄露信号检测 去噪、小波变换、油气管道泄露、信号检测 2、内容说明 摘 要: 油气管道泄漏会造成严重危害,因此,亟需寻找一种能快速检测油气管道信号的技术。传统的 傅里…

Java多线程实战-CompletableFuture异步编程优化查询接口响应速度

🏷️个人主页:牵着猫散步的鼠鼠 🏷️系列专栏:Java全栈-专栏 🏷️本系列源码仓库:多线程并发编程学习的多个代码片段(github) 🏷️个人学习笔记,若有缺误,欢迎评论区指正…

远程桌面安卓版下载 安卓远程控制免费版

远程桌面安卓版下载与安卓远程控制免费版的应用解析 随着移动互联网的快速发展,远程桌面应用逐渐成为了许多用户、特别是技术爱好者和商务人士的必备工具。它们不仅可以在电脑上实现远程控制,还能将这种功能延伸到移动设备上,如安卓手机和平…

R语言中的常用基础绘图函数 直方图,箱线图,条形图,散点图

目录 R语言中的绘图参数 绘图函数 1.plot函数绘制散点图 2.hist函数绘制直方图 如何修饰直方图? 如何在直方图上标注各组频数? 使用text函数把某些信息标注在直方图上 如何在直方图上添加概率密度曲线? 3.boxplot函数绘制箱线图 4.barplot函数…

一、MySQL基础学习

目录 1、MySQL启动2、MySQL客户端连接3、SQL3.1、SQL语句分类3.2、DDL(数据库定义语言)3.2.1、操作数据库3.2.2、操作数据表 3.3、DML(数据库操作语言)3.3.1、增加 insert into3.3.2、删除 delete3.3.3、修改 update 3.4、DQL&…

idea error java:compilation failed:internal java compiler error

idea中编译运行maven项目报错如下 idea error java:compilation failed:internal java compiler error 尝试如下操作 注意:jdk8 需要设置4个地方 1.首先打开File->Project Structure中的Project,将SDK和language level都设置一致,如下…

Jackson 2.x 系列【4】对象映射器 ObjectMapper

有道无术,术尚可求,有术无道,止于术。 本系列Jackson 版本 2.0.0 源码地址:https://gitee.com/pearl-organization/study-seata-demo 文章目录 1. 概述2. 案例演示2.1 创建对象2.2 写入2.3 读取 3. 泛型擦除 1. 概述 在前两篇文…

IO多分复用

#include<myhead.h> #define SER_PORT 8888 //服务器端口号 #define SER_IP "192.168.65.131" //服务器IPint main(int argc, const char *argv[]) {//1、创建一个套接字int sfd -1;sfd socket(AF_INET, SOCK_STREAM, 0); //参数1&#xff1a;…

北斗卫星引领农机春耕新时代

北斗卫星引领农机春耕新时代 随着现代科技的快速发展&#xff0c;北斗卫星成为了农业领域不可或缺的利器。在农机自动驾驶系统的引领下&#xff0c;农机正逐渐实现自主操作&#xff0c;为农民节省了大量的时间和精力&#xff0c;并最大限度地提高了农作物的产量和质量。 北斗…

30天拿下Rust之错误处理

概述 在软件开发领域&#xff0c;对错误的妥善处理是保证程序稳定性和健壮性的重要环节。Rust作为一种系统级编程语言&#xff0c;以其对内存安全和所有权的独特设计而著称&#xff0c;其错误处理机制同样体现了Rust的严谨与实用。在Rust中&#xff0c;错误处理通常分为两大类&…

词令微信小程序怎么添加到我的小程序?

微信小程序怎么添加到我的小程序&#xff1f; 1、找到并打开要添加的小程序&#xff1b; 2、打开小程序后&#xff0c;点击右上角的「…」 3、点击后底部弹窗更多选项&#xff0c;请找到并点击「添加到我的小程序」&#xff1b; 4、添加成功后&#xff0c;就可以在首页下拉我的…

迈入编程世界:C 语言初体验

写在前面&#xff1a;OK啊&#xff0c;前面我们介绍了C语言开发环境的搭建&#xff0c;今天我们再来初步的认识一下C语言&#xff0c;了解C语言的基础框架、数据的表现形式以及输入和输出。 文章特点&#xff1a;不会很正经&#xff0c;不会很学术&#xff0c;不会很理论&#…

J4G企业通讯ip电话 sip对讲主机 停车场对讲主机

J4G企业通讯ip电话 sip对讲主机 停车场对讲主机 SV-J4G 是一款企业级彩屏网络电话&#xff0c;具有高清语音&#xff0c;320x240 2.8英寸彩屏&#xff0c;支持千兆以太网&#xff0c;12个SIP账号&#xff0c;支持PoE供电&#xff0c;支持外接EHS无线耳机&#xff0c;三方电话会…

C++有关内存的那些事

个人主页&#xff1a;PingdiGuo_guo 收录转栏&#xff1a;C干货专栏 前言 本篇博客是讲解关于C内存的一些知识点的。 文章目录 前言 1.内存函数 1.1memcpy函数 1.2memmove函数 1.3 memset函数 2.各数据类型占用 2.1bool类型 2.2char类型 2.3short、int、long类型及整数…

京东商品信息采集API商品价格商品详情图主图抓取接口key(提供测试入口)

item_get 获得JD商品详情item_search 按关键字搜索商品item_search_img 按图搜索京东商品&#xff08;拍立淘&#xff09;item_search_shop 获得店铺的所有商品item_history_price 获取商品历史价格信息item_recommend 获取推荐商品列表buyer_order_list 获取购买到的商品订单列…

CMake笔记之GLOB和GLOB_RECURSE的使用方法

CMake笔记之GLOB和GLOB_RECURSE的使用方法 —— 杭州 2024-03-19 夜 文章目录 CMake笔记之GLOB和GLOB_RECURSE的使用方法1.GLOB使用方法2.GLOB对比GLOB_RECURSE 1.GLOB使用方法 在 CMake 中&#xff0c;file(GLOB ...) 命令用于将匹配特定模式的文件列表赋值给变量。这可以用…

MySQL中replace into详解、批量更新、不存在插入存在则更新、replace into的坑

文章目录 一、replace into原理二、replace into的三种形式三、replace into 使用案例3.1、replace into values3.1.1、只有主键且主键冲突3.1.2、有主键有唯一索引且主键冲突3.1.3、有主键有唯一索引且唯一索引冲突(有坑)3.1.4、有主键有唯一索引且与一条主键冲突与另一条唯一…

瑞_Redis_短信登录_基于Session实现登录流程

文章目录 项目介绍1 短信登录1.1 项目准备1.2 基于Session实现登录流程1.2.1 功能流程介绍1.2.1.1 发送短信验证码1.2.1.2 短信验证码登录、注册1.2.1.3 校验登录状态 1.2.2 实现发送短信验证码功能1.2.2.1 页面流程1.2.2.2 代码实现1.2.2.3 测试 1.2.3 实现短信验证码登录、注…

2024年蓝牙耳机哪个好?真人实测告诉你如何选购,避免后悔!

在繁忙的通勤途中&#xff0c;无线蓝牙耳机已成为我们摆脱线缆束缚、享受音乐的理想选择。面对众多品牌和型号&#xff0c;选择合适的耳机似乎并不简单。因此&#xff0c;我精心挑选了几款表现不错的蓝牙耳机&#xff0c;希望我的分享能为你提供有价值的参考。 一、如何挑选蓝牙…

搭建EMQX MQTT服务器(超详细)

MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;服务器是一种实现 MQTT 协议的服务器软件。MQTT 是一种轻量级的、发布/订阅模式的消息传输协议&#xff0c;通常用于物联网&#xff08;IoT&#xff09;应用中的设备通信。MQTT 服务器负责接收来自客户端的消息…