在数据库里面,有些表之间是存在关联性的,在某张表中的记录删除后,另一张表中的记录也应该同步删除。你知道怎么自动地做到这一点吗?
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 编辑过