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