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;

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

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

相关文章

JVM——几种常见的对象引用

目录 1. 软引用软引用的使用场景-缓存 2.弱引用3.虚引用和终结器引用 可达性算法中描述的对象引用,一般指的是强引用,即是GCRoot对象对普通对象有引用关系,只要这层关系存在, 普通对象就不会被回收。除了强引用之外,Ja…

C++局域网从服务器获取已连接用户的列表(linux to linux)

目录 服务器端 代码 客户端 代码解析 服务器端 原理 遇到的阻碍以及解决办法 客户端 原理 遇到的阻碍以及解决办法 运行结果截图 总结 服务器端 代码 #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <netinet…

深入了解 Pinia:现代 Vue 应用的状态管理利器

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

【Python】用三种方法创建tkinter桌面窗口

Python的tkinter是Python的标准GUI库之一&#xff0c;它是一个开源的、跨平台的GUI工具包&#xff0c;可以用于创建桌面应用程序。 tkinter提供了许多常见的GUI组件&#xff0c;例如按钮、文本框、标签、列表框等等&#xff0c;可以轻松地创建各种类型的桌面应用程序。它还支持…

云服务器上部署 Web 项目及端口异常处理

文章目录 1. 在云服务器的 MySQL(MariaDB) 中, 建库建表2. 微调代码3. 打包4. 把 war 包 拷贝到云服务器上端口被占用处理 1. 在云服务器的 MySQL(MariaDB) 中, 建库建表 在云服务器中进入 MySQL mysql -u root -p把之前本地写好的 SQL 代码一粘贴即可 例如: -- 这个文件主要…

面试笔记--Linux常用命令

文件和目录操作&#xff1a; ls: 列出目录内容 例子&#xff1a;ls -l - 列出详细信息&#xff0c;包括权限、所有者等 cd: 切换目录 例子&#xff1a;cd Documents - 进入 “Documents” 目录 pwd: 显示当前工作目录 例子&#xff1a;pwd - 显示当前工作目录的路径 cp: 复制文…

线性表,也是Java中数组的知识点!

线性表定义&#xff1a; 由n (n≥0)个数据特性相同的元素构成的有限序列称为线性表&#xff0c;(n0)的时候被称为空表。 线性表的顺序表示 线性表的顺序存储又被称为顺序表 优点 无需为表示表中元素之间的逻辑关系而增加额外的存储空间可以随意读取任意位置的元素 缺点 插入…

人力资源管理后台 === 登陆+主页灵鉴权

目录 1. 分析登录流程 2. Vuex中用户模块的实现 3.Vue-cli代理解决跨域 4.axios封装 5.环境区分 6. 登录联调 7.主页权限验证-鉴权 1. 分析登录流程 传统思路都是登录校验通过之后&#xff0c;直接调用接口&#xff0c;获取token之后&#xff0c;跳转到主页。 vue-elemen…

html实现360度产品预览(附源码)

文章目录 1.设计来源1.1 拖动汽车产品旋转1.2 汽车产品自动控制 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/134613931 html实现360度产品预览&#xff08;附源码&…

VUE留言板

效果预览图 完整代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>作业</title><styl…

Flutter | TextField长按时选项菜单复制、粘贴显示为英文问题解决

Flutter | TextField长按时选项菜单复制、粘贴显示为英文问题解决 问题描述&#xff1a; 长按TextField后&#xff0c;显示剪切、复制等选项为英文&#xff0c;如下图所示&#xff0c;这是因为问未设置语言本地化&#xff0c;我们需要进行设置。 首先在pubspec.yaml加入以下依赖…

rsyslog出现Unit rsyslog.service is masked不可用问题解决

博主在测试将日志发送到日志服务器的功能时遇到了rsyslog服务不可用的问题&#xff0c;具体来说&#xff0c;就是执行systemctl restart rsyslog或者 service rsyslog restart命令时&#xff0c;出现了标题中所述的Unit rsyslog.service is masked问题。网上查找了很多资料&…

LuatOS-SOC接口文档(air780E)--pwm - PWM模块

pwm.open(channel, period, pulse, pnum, precision) 开启指定的PWM通道 参数 传入值类型 解释 int PWM通道 int 频率, 1-1000000hz int 占空比 0-分频精度 int 输出周期 0为持续输出, 1为单次输出, 其他为指定脉冲数输出 int 分频精度, 100/256/1000, 默认为100,…

【代码】平抑风电波动的电-氢混合储能容量优化配置(完美复现)matlab-yalmip-cplex/gurobi

程序名称&#xff1a;平抑风电波动的电-氢混合储能容量优化配置 实现平台&#xff1a;matlab-yalmip-cplex/gurobi 代码简介&#xff1a;针对电-氢混合系统协同平抑接入新型电力系统的 新能源波动问题&#xff0c;提出考虑碱性电解槽运行特性的电-氢 混合储能容量优化配置方案…

c和c++中的异同

C和C 中的异同&#xff1a; 相同点&#xff1a; 1.C和C中的const修饰的全局变量都是保存在常量区&#xff0c;不能修改 不同点&#xff1a; C语言中const修饰的局部变量赋值为常量是&#xff0c;局部变量保存在栈区&#xff0c;可以被修改 C中const修饰的局部变量赋值为常量是&…

Meta最新视频生成工具:emu video技术报告解读

Diffusion Models视频生成-博客汇总 前言:去年Meta推出了make-a-video,过去了一年多仍然是视频生成领域的SOTA。最近Meta又推出了更强的视频生成模型EMU Video,刷新了多项指标。这篇博客解读一下背后的论文《EMU VIDEO: Factorizing Text-to-Video Generation by Explicit I…

这一款 Mac 系统终端工具,已经用的爱不释手了!

&#x1f525;&#x1f525;&#x1f525;作为程序员或者运维管理人员&#xff0c;我们经常需要使用终端工具来进行服务器管理及各种操作&#xff0c;比如部署项目、调试代码、查看/优化服务、管理服务器等。 相信大家用的最多的终端工具就是 Xshell、iTerm2和Mobaxterm&#…

【JavaEE初阶】浅谈进程

✏️✏️✏️今天正式进入JavaEE初阶的学习&#xff0c;给大家分享一下关于进程的一些基础知识。了解这部分内容&#xff0c;只是为后续多线程编程打好基础&#xff0c;因此进程部分的知识&#xff0c;不需要了解更加细节的内容。 清风的CSDN博客 &#x1f61b;&#x1f61b;&a…

汽车电子 - UDS

汽车电子 - UDS 概念基本概念分类请求与响应寻址信息物理寻址功能寻址 协议格式&#xff1f;&#xff1f;&#xff1f;750/758厂家自定义的吗&#xff1f;&#xff1f;&#xff1f;&#xff0c; 所有的UDS服务都在这里边吗&#xff1f;&#xff1f;&#xff1f;&#xff0c;代码…

快速弄懂Pyqt5的4种项目部件(Item Widget)

快速掌握Pyqt5的三种主窗口 快速掌握Pyqt5的2种弹簧 快速掌握Pyqt5的5种布局 快速弄懂Pyqt5的5种项目视图&#xff08;Item View&#xff09; 快速掌握Pyqt5的6种按钮 待续。。。 在PyQt5中&#xff0c;item widget是指可以放置在某些特定控件中的小部件&#xff0c;这些控件如…