sqlite外键约束 保证数据一致性

1. 外键约束

在SQLite中,可以通过使用外键(Foreign Key)约束CASCADE 选项来实现通过外键删除相关信息

CASCADE选项是指在主键表中删除记录时,相应的外键表中的相关记录也将被自动删除。

sql 复制代码
-- 创建主键表
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. 一个表中含有多个外键约束

一个表可以与其他表建立多个关联关系,每个关联关系都需要通过外键来实现。每个外键约束都描述了表与表之间的关系。

每个外键约束的操作是相互独立的,对一个外键的操作不会影响其他外键的操作。

sql 复制代码
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 表相关的记录。

sql 复制代码
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;
相关推荐
Re.不晚30 分钟前
MySQL进阶之战——索引、事务与锁、高可用架构的三重奏
数据库·mysql·架构
老邓计算机毕设40 分钟前
SSM智慧社区信息化服务平台4v5hv(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·智慧社区、·信息化平台
麦聪聊数据1 小时前
为何通用堡垒机无法在数据库运维中实现精准风控?
数据库·sql·安全·低代码·架构
2301_790300961 小时前
Python数据库操作:SQLAlchemy ORM指南
jvm·数据库·python
m0_736919101 小时前
用Pandas处理时间序列数据(Time Series)
jvm·数据库·python
亓才孓1 小时前
[JDBC]PreparedStatement替代Statement
java·数据库
m0_466525292 小时前
绿盟科技风云卫AI安全能力平台成果重磅发布
大数据·数据库·人工智能·安全
爱学习的阿磊2 小时前
使用Fabric自动化你的部署流程
jvm·数据库·python
枷锁—sha3 小时前
【SRC】SQL注入快速判定与应对策略(一)
网络·数据库·sql·安全·网络安全·系统安全
惜分飞3 小时前
ORA-600 kcratr_nab_less_than_odr和ORA-600 4193故障处理--惜分飞
数据库·oracle