PostgreSQL 中的外來鍵 ON DELETE CASCADE

Bilal Shahid 2022年5月14日
PostgreSQL 中的外來鍵 ON DELETE CASCADE

在我們開始研究在 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 操作。

Author: Bilal Shahid
Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub