PostgreSQL 教程: DELETE CASCADE 级联删除

六月 1, 2024

摘要:在本教程中,您将学习如何在从父表中删除父行时,使用 PostgreSQL DELETE CASCADE删除子表中的相关行。

目录

PostgreSQL DELETE CASCADE 简介

在 PostgreSQL 中,DELETE CASCADE是一个关联操作,允许您在从父表中删除父行时自动删除子表中的相关行。

此功能通过确保在相关行被删除时删除相应的依赖行,来帮助您维护数据库中的引用完整性。

要启用DELETE CASCADE操作,您需要有两个相关的表parent_tablechild_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_tableid列的外键。

ON DELETE CASCADE是在外键上的动作,每当删除parent_table中的相应行时,该动作将自动删除child_table中的行。

我们来看一个例子。

PostgreSQL DELETE CASCADE 示例

首先,创建表departmentsemployees,来存储部门和员工:

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表中的行时要采取的关联操作。

第二步,插入行departmentsemployees表:

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 | John Doe        |             1
  2 | Jane Smith      |             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操作,在删除父行时自动删除子表中的相关行。