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