sqlite外键约束 保证数据一致性
1. 外键约束
在SQLite中,可以通过使用外键(Foreign Key)约束和CASCADE选项来实现通过外键删除相关信息。
CASCADE选项是指在主键表中删除记录时,相应的外键表中的相关记录也将被自动删除。
-- 创建主键表
CREATE TABLE Persons (PersonID INTEGER PRIMARY KEY,FirstName TEXT,LastName TEXT
);-- 创建外键表,并指定外键约束
CREATE TABLE Orders (OrderID INTEGER PRIMARY KEY,OrderNumber TEXT,PersonID INTEGER,FOREIGN KEY (PersonID) REFERENCES Persons(PersonID) ON DELETE CASCADE
);-- 插入一些数据
INSERT INTO Persons (PersonID, FirstName, LastName) VALUES (1, 'John', 'Doe');
INSERT INTO Orders (OrderID, OrderNumber, PersonID) VALUES (101, 'A123', 1);
INSERT INTO Orders (OrderID, OrderNumber, PersonID) VALUES (102, 'B456', 1);-- 查询数据
SELECT * FROM Persons;
SELECT * FROM Orders;-- 删除Persons表中的记录,由于外键上有CASCADE选项,相关的Orders表中的记录也会被删除
DELETE FROM Persons WHERE PersonID = 1;-- 再次查询数据
SELECT * FROM Persons;
SELECT * FROM Orders;
在关系型数据库中,外键的约束和操作是定义在表级别的,而不是在记录级别。当使用 ON DELETE CASCADE 时,它指定的是删除主表(Persons 表)中的记录时,如何处理与之关联的外键表(Orders 表)中的记录。
在前面的例子中,当删除 ‘Persons’ 表中 ‘PersonID’ 为 1 的记录时,由于有 ON DELETE CASCADE,相关的 ‘Orders’ 表中 ‘PersonID’ 为 1 的记录也会被删除。这是因为在删除 ‘Persons’ 表中 ‘PersonID’ 为 1 的记录时,外键约束会告诉数据库引擎,也要删除 ‘Orders’ 表中相关的记录,以保持数据的一致性。
然而,如果在 ‘Orders’ 表中删除 ‘PersonID’ 的信息,不会直接影响 ‘Persons’ 表。外键关系是单向的。在这个特定的例子中,只有当删除 ‘Persons’ 表中的记录时,才会影响 ‘Orders’ 表中相关的记录。
因此,如果在 ‘Orders’ 表中删除 ‘PersonID’ 的信息,不会直接导致 ‘Persons’ 表中相关的记录被删除。只有在删除 ‘Persons’ 表中 ‘PersonID’ 的记录时,由于 ON DELETE CASCADE,才会影响 ‘Orders’ 表中相关的记录。
2. 一个表中含有多个外键约束
一个表可以与其他表建立多个关联关系,每个关联关系都需要通过外键来实现。每个外键约束都描述了表与表之间的关系。
每个外键约束的操作是相互独立的,对一个外键的操作不会影响其他外键的操作。
CREATE TABLE Persons (PersonID INTEGER PRIMARY KEY,FirstName TEXT,LastName TEXT
);CREATE TABLE Orders (OrderID INTEGER PRIMARY KEY,OrderNumber TEXT,PersonID INTEGER,FOREIGN KEY (PersonID) REFERENCES Persons(PersonID) ON DELETE CASCADE ON UPDATE NO ACTION
);CREATE TABLE Invoices (InvoiceID INTEGER PRIMARY KEY,InvoiceNumber TEXT,CustomerID INTEGER,VendorID INTEGER,FOREIGN KEY (CustomerID) REFERENCES Persons(PersonID) ON DELETE SET NULL ON UPDATE CASCADE,FOREIGN KEY (VendorID) REFERENCES Persons(PersonID) ON DELETE SET NULL ON UPDATE CASCADE
);
在上述例子中,Invoices 表包含两个外键约束,分别与 Persons 表的两个关联关系相关联。Invoices 表中的 CustomerID 列和 VendorID 列都是对应于 Persons 表中的 PersonID 列的外键。
第一个外键约束将 CustomerID 列与 Persons 表的 PersonID 列关联,并指定了 ON DELETE SET NULL 和 ON UPDATE CASCADE。
第二个外键约束将 VendorID 列与 Persons 表的 PersonID 列关联,并同样指定了 ON DELETE SET NULL 和 ON UPDATE CASCADE。
3. 多表之间的外键约束
在标准的 SQL 外键约束中,删除 A 表的一条记录时,如果 B 表有对 A 表的外键约束,并且设置了 ON DELETE CASCADE,则会自动删除 B 表中与 A 表相关的记录。如果 C 表有对 B 表的外键约束,同样设置了 ON DELETE CASCADE,那么在删除 A 表的记录时,会先触发删除 B 表的记录,然后会自动删除 C 表中与 B 表相关的记录。
CREATE TABLE A (A_ID INTEGER PRIMARY KEY
);CREATE TABLE B (B_ID INTEGER PRIMARY KEY,A_ID INTEGER,FOREIGN KEY (A_ID) REFERENCES A(A_ID) ON DELETE CASCADE
);CREATE TABLE C (C_ID INTEGER PRIMARY KEY,B_ID INTEGER,FOREIGN KEY (B_ID) REFERENCES B(B_ID) ON DELETE CASCADE
);-- 插入一些数据
INSERT INTO A (A_ID) VALUES (1);
INSERT INTO B (B_ID, A_ID) VALUES (100, 1);
INSERT INTO C (C_ID, B_ID) VALUES (1000, 100);-- 查询数据
SELECT * FROM A;
SELECT * FROM B;
SELECT * FROM C;-- 删除 A 表中的记录,观察 B 表和 C 表的变化
DELETE FROM A WHERE A_ID = 1;-- 查询数据,您会发现 B 表和 C 表中与 A 表相关的记录都被删除了
SELECT * FROM A;
SELECT * FROM B;
SELECT * FROM C;
相关文章:
sqlite外键约束 保证数据一致性
1. 外键约束 在SQLite中,可以通过使用外键(Foreign Key)约束和CASCADE选项来实现通过外键删除相关信息。 CASCADE选项是指在主键表中删除记录时,相应的外键表中的相关记录也将被自动删除。 -- 创建主键表 CREATE TABLE Persons…...

Vue轻松入门,附带学习笔记和相关案例
目录 案例 一Vue基础 什么是Vue? 补充:mvvm框架 mvvm的组成 详解 Vue的使用方法 1.直接下载并引入 2.通过 CDN 使用 Vue 3.通过npm安装 4.使用Vue CLI创建项目 二插值表达式 什么是插值表达式? 插值表达式的缺点 解决方法 …...

【青蛙跳台阶问题 —— (三种算法)】
青蛙跳台阶问题 —— (三种算法) 一.题目介绍1.1.题目1.2.图示 二.解题思路三.题解及其相关算法3.1.递归分治法3.2.动态规划算法(Dynamic Programming)3.3.斐波那契数列法 四.注意细节 一.题目介绍 1.1.题目 一只青蛙一次可以跳上1级台阶&am…...
联想yoga AMD处理器 转接头无法电量外接显示器
第一次买AMD的处理器,当时就是为了yogaAMD这款的接口要比英特尔的接口多,没想到AMD处理器真的问题多。经常蓝屏不说,偶尔还点不亮外接显示器。遇到这种问题,不是什么驱动问题,可能你按照网上各种方法打开设备管理器→显…...

OSG粒子系统与阴影 - 阴影shadow(7)
OSG阴影 在虚拟现实仿真中,为了真实地模拟自然效果,阴影效果是不可缺少的,它对一个场景的真实性是非常重要的。在游戏或仿真中,一个高效的阴影往往能够提供非常强悍的视觉真实感。 osgShadow库 在OSG中专门定义了一个名字空间osg…...

vue3项目中使用富文本编辑器
前言 适配 Vue3 的富文本插件不多,我看了很多插件官网,也有很多写的非常棒的,有UI非常优雅让人耳目一新的,也有功能非常全面的。 如: Quill,简单易用,功能全面。editorjs,UI极其优…...

Java EE 进程线程
JavaEE 进程&线程 文章目录 JavaEE 进程&线程1. 进程1.1 概念1.2 进程管理1.3 PCB (Process Control Block) 2. 线程2.1 概念2.1 线程与进程的区别2.3 创建线程 1. 进程 1.1 概念 什么是进程? 进程是操作系统对一个正在执行的程序的一种抽象 我们可以打开…...
GPT写SQL的模版
表:profit_loss_sum_m_snapshot 计算字段:成本cost_whole求和,收入income_whole求和,收入求和-成本求和,成本目标cost_target求和,收入求和-成本目标求和 条件:日期statis_date在2023-11-01&…...
蓝桥杯官网练习题(平均)
问题描述 有一个长度为 n 的数组( n 是 10 的倍数),每个数 ai 都是区间 [0,9] 中的整数。小明发现数组里每种数出现的次数不太平均,而更改第 i 个数的代价为 bi,他想更改若干个数的值使得这 10 种数出现的次数相等…...

【无标题】动手学深度学习_现代神经网络_未完
这里写目录标题 深度学习之前的网络 AlexNetAlexNet得到了竞赛冠军AlexNet架构Alex net更多细节数据增强 VGGNiN知识补充flop暂退法 drop_out 深度学习之前的网络 1、核方法 机器学习 SVM现在还是很广泛的使用,因为对调参的需求不那么大,对调参不太敏感…...

Java王者荣耀
GameFrame 图片 package 王者荣耀;import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.io.File; import java.util.ArrayList;import javax.soun…...

【理解ARM架构】操作寄存器实现UART | 段的概念 | IDE背后的命令
🐱作者:一只大喵咪1201 🐱专栏:《理解ARM架构》 🔥格言:你只管努力,剩下的交给时间! 目录 🍠操作寄存器实现UART🍟UART原理🍟编程 🍠…...
python 左值查找 右值查找
左值查找 在一组数据中查找出 数字x 在这组数据中第一次出现的索引并输出,没有找到则输出-1查找方式:二分查找 数据前提:一组数据要有序一组数据: arr [2, 3, 3, 3, 5, 7, 9, 11, 13, 15, 17]测试: 示例1ÿ…...
机器学习之自监督学习(四)MoCo系列翻译与总结(二)
MoCo中相关工作的对比分析 去噪自动编码器(Denoising Autoencoder)是一种用于学习数据表示的神经网络模型。它的主要目标是通过去除输入数据中的噪声,学习到输入数据的有用表示,从而提高模型对干净数据的鲁棒性。下面是对去噪自动…...
元宇宙企业3d数字展厅轻松低本搭建更全面、多元、趣味化的展览
对所有企业来说,拥有一个3D线上展厅是互联网营销必不可少的部分,但是3D线上展厅定制周期长费用高,让很多企业公司望而却步,web3d开发公司制作的3D线上企业展厅制作平台备导览地图、语音解说、交互热点、全景漫游、自主行走、链接跳…...
华为OD机试真题-开源项目热榜-2023年OD统一考试(C卷)
题目描述: 某个开源社区希望将最近热度比较高的开源项目出一个榜单,推荐给社区里面的开发者。对于每个开源项目,开发者可以进行关注(watch)、收藏(star)、fork、提issue、提交合并请求(MR)等。 数据库里面统计了每个开源项目关注、收藏、fork、issue、MR的数量,开源项目的热…...

深入探索Maven:优雅构建Java项目的新方式(一)
Maven高级 1,分模块开发1.1 分模块开发设计1.2 分模块开发实现 2,依赖管理2.1 依赖传递与冲突问题2.2 可选依赖和排除依赖方案一:可选依赖方案二:排除依赖 3,聚合和继承3.1 聚合步骤1:创建一个空的maven项目步骤2:将项目的打包方式改为pom步骤…...

Shopee如何入驻?如何防封?
Shopee作为东南亚领航电商平台,面向东南亚蓝海市场,近年来随着东南亚市场蒸蒸日上,虾皮也吸引了大批量的跨境商家入驻。那么接下来就给想要入驻的虾皮小白一个详细的安全入驻教程。 一、商家如何入驻 虾皮与LAZADA最大的区别就是商家即卖家&…...

2024年第十六届山东省职业院校技能大赛中职组 “网络安全”赛项竞赛正式卷任务书
2024年第十六届山东省职业院校技能大赛中职组 “网络安全”赛项竞赛正式卷任务书 2024年第十六届山东省职业院校技能大赛中职组 “网络安全”赛项竞赛正式卷A模块基础设施设置/安全加固(200分)A-1:登录安全加固(Windows, Linux&am…...

Python编程基础
Python是一种简单易学的编程语言,广泛应用于Web开发、数据分析、人工智能等领域。无论您是初学者还是有一定编程经验的人士,都可以从Python的基础知识开始建立自己的编程技能。 目录 理论Python语言的发展程序设计语言的分类静态语言与脚本语言的区别 代…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...

【C++】纯虚函数类外可以写实现吗?
1. 答案 先说答案,可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...