当前位置: 首页 > news >正文

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&#xff…...

机器学习之自监督学习(四)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语言的发展程序设计语言的分类静态语言与脚本语言的区别 代…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

线程同步:确保多线程程序的安全与高效!

全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...