在数据库里面,有些表之间是存在关联性的,在某张表中的记录删除后,另一张表中的记录也应该同步删除。你知道怎么自动地做到这一点吗?
PostgreSQL DELETE CASCADE 简介
在 PostgreSQL 中,DELETE CASCADE
是一个关联操作,允许您在从父表中删除父行时自动删除子表中的相关行。
此功能通过确保在相关行被删除时删除相应的依赖行,来帮助您维护数据库中的引用完整性。
要启用DELETE CASCADE
操作,您需要有两个相关的表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
中的相应行时,该动作将自动删除child_table
中的行。
我们来看一个例子。
PostgreSQL DELETE CASCADE 示例
首先,创建表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
表中的行时要采取的关联操作。
第二步,插入行到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)
第三步,删除一个部门,观察对相关员工产生的级联效果:
DELETE FROM departments
WHERE id = 1;
执行此语句后,由于在外键约束上定义的DELETE CASCADE
操作,它将删除属于department_id
= 1 的部门的所有员工。
最后,从employees
表中检索数据,验证下与已删除部门关联的员工:
SELECT * FROM employees;
输出:
id | name | department_id
----+-----------------+---------------
3 | Michael Johnson | 2
(1 row)
输出表明部门 id 为 1 的员工已成功删除。
总结
使用 PostgreSQL 的DELETE CASCADE
操作,在删除父行时自动删除子表中的相关行。
该文章在 2024/7/23 20:52:21 编辑过