迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 数据库 > PostgreSQL >

PostgreSQL 中的外键 ON DELETE CASCADE

作者:迹忆客 最近更新:2023/03/20 浏览次数:

在我们开始研究在 PostgreSQL 中实现 ON DELETE CASCADE 的不同解决方案之前,我们将首先了解 ON DELETE CASCADE 的含义以及它的作用。

让我们假设你有两个表,其中一个从父表继承一个 KEY 并使用它的值,也称为 ASSOCIATION。现在假设用户想要删除父表中的这一行。

可是等等?子表中继承的行会发生什么?

你可能会认为此 VIOLATION 会引发错误。正确的!幸运的是,这不起作用,并且会产生错误。

ERROR:  update or delete on table [your_table] violates foreign key constraint [f_key] on table [your_table]

但是,如果你不想限制 DELETE,而是继续从两个表中 DELETE 这一行,该怎么办。这就是我们的操作所在。

让我们看看它是如何工作的。

在 PostgreSQL 中使用 ON DELETE CASCADE

让我们首先创建一个 Vehicle 表。

create table vehicle (
	id int PRIMARY KEY,
	OWNER TEXT
);

现在让我们定义另一个名为 BUS 的表,它将从 VEHICLE 继承键 ID

create table bus (
	id int PRIMARY KEY references vehicle,
	Model TEXT
);

你可以在 ID 定义的末尾看到 REFERENCES 标签。这意味着它现在引用 VEHICLE 表中的行,并且该表中的任何 IDVEHICLE 表中的 ID 不匹配的 INSERT 操作将被拒绝。

现在让我们假设我们在 VEHICLE 表中 INSERT 了一些值。

Insert into vehicle values (1, 'mark'), (2, 'john');

让我们也 INSERT 一个值到 BUS 表中。

insert into bus values (2, 'High_Van');

所以现在 BUS 表指的是 VEHICLE 表中的 KEY``2,这意味着 High_Van 属于 John

现在让我们尝试从 BUS 中删除该条目。

如果你打电话:

delete from vehicle where id = 2

将返回一个错误。

ERROR:  update or delete on table "vehicle" violates foreign key constraint "bus_id_fkey" on table "bus"
DETAIL:  Key (id)=(2) is still referenced from table "bus".

这告诉你在表 BUS 中仍然引用 KEY``2。因此 DELETE 将不起作用。现在让我们定义如果我们调用 DELETE 会发生什么。

BUS 表中,修改 ID 列。

create table bus (
	id int PRIMARY KEY references vehicle ON DELETE CASCADE,
	Model TEXT
);

现在,当我们尝试 DELETE 时,它可以完美运行。为什么?因为 CASCADE 倾向于删除子表中为 DELETE 建议的行。

假设你最好使用原始方法并想要定义你的方法。在这种情况下,你可以尝试将 ON DELETE CASCADE 更改为 ON DELETE RESTRICT,这最终将限制任何发生冲突的 DELETE 操作。

你甚至可以通过其他方式将这些选项用于 ON UPDATE 操作。

在 PostgreSQL 中关于定义多个 ON CASCADE DELETE 约束所面临的问题的简短说明

当你删除引用数千个表的行时,对所有继承表进行 ON DELETE CASCADE 会产生问题。这将产生一个问题,但回滚到任何更改都极不可能。

始终确保对 DELETE 使用良好的做法。如果你想 CASCADE,请调用 DELETE 的函数,然后进行 TRANSACTION 并不断检查是否发生错误而不是在最后。

这将保证你的数据库的安全性和安全性,并避免将来出现问题。

我们希望你学会了如何在 PostgreSQL 中执行 ON DELETE CASCADE 操作。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

在 PSQL 中运行 SQL 文件

发布时间:2023/03/20 浏览次数:178 分类:数据库

本文解释了如何直接从终端/命令行或 psql shell 运行 SQL 文件。为此,你需要指定主机名、端口、用户名和数据库名称。

在 PostgreSQL 中使用循环

发布时间:2023/03/20 浏览次数:124 分类:PostgreSQL

在 PL/SQL 中,你可能需要在 Postgres 中使用循环。我们可以使用 FOR 和 WHILE 语句来创建循环。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便