在數(shù)據(jù)庫里面,有些表之間是存在關(guān)聯(lián)性的,在某張表中的記錄刪除后,另一張表中的記錄也應(yīng)該同步刪除。你知道怎么自動地做到這一點嗎?
PostgreSQL DELETE CASCADE 簡介
在 PostgreSQL 中,DELETE CASCADE
是一個關(guān)聯(lián)操作,允許您在從父表中刪除父行時自動刪除子表中的相關(guān)行。
此功能通過確保在相關(guān)行被刪除時刪除相應(yīng)的依賴行,來幫助您維護數(shù)據(jù)庫中的引用完整性。
要啟用DELETE CASCADE
操作,您需要有兩個相關(guān)的表parent_table
和child_table
:
CREATE TABLE parent_table(
id SERIAL PRIMARY KEY,
...
);
CREATE TABLE child_table(
id SERIAL PRIMARY KEY,
parent_id INT,
FOREIGN_KEY(parent_id)
REFERENCES parent_table(id)
ON DELETE CASCADE
);
在子表中,parent_id
是一個引用parent_table
的id
列的外鍵。
ON DELETE CASCADE
是在外鍵上的動作,每當刪除parent_table
中的相應(yīng)行時,該動作將自動刪除child_table
中的行。
我們來看一個例子。
PostgreSQL DELETE CASCADE 示例
首先,創(chuàng)建表departments
和employees
,來存儲部門和員工:
CREATE TABLE departments (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
CREATE TABLE employees (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
department_id INT NOT NULL,
FOREIGN KEY(department_id)
REFERENCES departments(id)
ON DELETE CASCADE
);
在此用例中,一個部門可能有一個或多個員工,每個員工都屬于一個部門。
在employees
表中,department_id
是一個引用departments
表的id
列的外鍵。
該外鍵上有ON DELETE CASCADE
子句,該子句指定了在刪除departments
表中的行時要采取的關(guān)聯(lián)操作。
第二步,插入行到departments
和employees
表:
INSERT INTO departments (name)
VALUES
('Engineering'),
('Sales')
RETURNING *;
INSERT INTO employees (name, department_id)
VALUES
('John Doe', 1),
('Jane Smith', 1),
('Michael Johnson', 2)
RETURNING *;
輸出:
id | name
----+-------------
1 | Engineering
2 | Sales
(2 rows)
id | name | department_id
----+-----------------+---------------
1 | JohnDoe | 1
2 | JaneSmith | 1
3 | Michael Johnson | 2
(3 rows)
第三步,刪除一個部門,觀察對相關(guān)員工產(chǎn)生的級聯(lián)效果:
DELETE FROM departments
WHERE id = 1;
執(zhí)行此語句后,由于在外鍵約束上定義的DELETE CASCADE
操作,它將刪除屬于department_id
= 1 的部門的所有員工。
最后,從employees
表中檢索數(shù)據(jù),驗證下與已刪除部門關(guān)聯(lián)的員工:
SELECT * FROM employees;
輸出:
id | name | department_id
----+-----------------+---------------
3 | Michael Johnson | 2
(1 row)
輸出表明部門 id 為 1 的員工已成功刪除。
總結(jié)
使用 PostgreSQL 的DELETE CASCADE
操作,在刪除父行時自動刪除子表中的相關(guān)行。
該文章在 2024/7/23 20:52:21 編輯過