LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

你知道什么是 SQL 中的级联删除吗?

admin
2024年7月22日 18:28 本文热度 416

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

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(100NOT NULL
);

CREATE TABLE employees (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100NOT 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 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 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved