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 表中的行,並且該表中的任何 ID 與 VEHICLE 表中的 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 操作。
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