对两个外键约束进行级联删除

2024-02-12

我有以下示例:

Table A
   -some_id

Table B
   -another_id

Table C
   -some_id_fk
   -another_id_fk

我想级联一行Table C如果两者都some_id and another_id从各自的表中删除。

当删除两个外键时,如何使表 C 中的一行级联自身?

如果仅删除其中一个外键,则受影响的行在引用该外键的列中应更改为空值。


我建议两个外键约束ON DELETE SET NULL https://www.postgresql.org/docs/current/ddl-constraints.html#DDL-CONSTRAINTS-FK以及一个负责其余工作的触发器

Tables:

CREATE TABLE a (a_id serial PRIMARY KEY, a text NOT NULL);
CREATE TABLE b (b_id serial PRIMARY KEY, b text NOT NULL);

CREATE TABLE ab (
  ab_id serial PRIMARY KEY
, a_id int REFERENCES a ON DELETE SET NULL
, b_id int REFERENCES b ON DELETE SET NULL
, UNIQUE (a_id, b_id)
);

Trigger:

CREATE OR REPLACE FUNCTION trg_ab_upbef_nulldel()
  RETURNS trigger
  LANGUAGE plpgsql AS
$func$
BEGIN
   DELETE FROM ab WHERE ab_id = NEW.ab_id;
   RETURN NULL;  -- to cancel UPDATE
END
$func$;

CREATE TRIGGER upbef_null2del
BEFORE UPDATE OF a_id, b_id ON ab
FOR EACH ROW
WHEN (NEW.a_id IS NULL AND NEW.b_id IS NULL)
EXECUTE PROCEDURE trg_ab_upbef_nulldel();

db<>fiddle
Old sqlfiddle http://sqlfiddle.com/#!17/cdcee/1

确保连接表有一个替代 PK 列。(a_id, b_id)无论如何都不能是 PK,因为这将不允许两者都为 NULL。添加一个UNIQUE约束 https://www.postgresql.org/docs/current/ddl-constraints.html#DDL-CONSTRAINTS-UNIQUE-CONSTRAINTS相反,它允许 NULL 值。

该触发器针对性能进行了优化,并且仅在两个 FK 列之一更新时才会启动,并且仅当更新导致两者都更新时才会启动。NULL.

触发函数删除该行并返回NULL以取消now void级联UPDATE.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对两个外键约束进行级联删除 的相关文章

  • 计算 mysql 数据库行数的最佳方法

    在遇到 mysql 查询加载时间慢的问题后 我现在正在寻找计算行数的最佳方法 我曾经愚蠢地使用过mysql num rows 函数来做到这一点 现在意识到这是最糟糕的方法 我实际上正在制作一个分页来用 PHP 制作页面 我找到了几种计算行数
  • java库维护数据库结构

    我的应用程序一直在开发 所以偶尔 当版本升级时 需要创建 更改 删除一些表 修改一些数据等 通常需要执行一些sql代码 是否有一个 Java 库可用于使我的数据库结构保持最新 通过分析类似 db structure version 信息并执
  • SQL Server 2008 错误 233

    我正在使用以下 sql 脚本在 SQL Server 2008 中创建新登录名 CREATE LOGIN xyz WITH PASSWORD xyz DEFAULT DATABASE master DEFAULT LANGUAGE us e
  • 没有为 1 个或多个必需参数给出值。更新SQL

    我正在编写一个程序 当用户在列表视图上选择记录时 该程序会更新密码或积分 我收到错误 没有为 1 个或多个必需参数给出值 我不知道如何纠正 我是否遗漏了一些明显的东西 Dim sql As String UPDATE Users SET P
  • 使用 NLog .NET Core 将日志记录到 PostgreSQL DB

    我尝试将日志记录集成到 NET Core 中的数据库 我能够设置 NLog 并将消息记录到 SQL Server 这很容易 但是当我尝试将 DB 切换到 PostgreSQL 时 似乎没有记录任何内容 以下是startup cs中的代码 p
  • 当从属文本框中没有输入文本时,如何让 gridview 显示所有表格行?

    下面的代码可以正常工作 并根据文本框中输入的文本过滤我的网格视图 当我的文本框中没有输入任何文本时 我没有得到任何结果 并且无法理解为什么 我的问题 如何让gridview显示all当文本框中没有输入文本时表行 MSSQL Search n
  • 包含列和行总计的 SQL 数据透视表

    我正在尝试将行和列总计添加到该数据透视表中 create table test4 city nvarchar 10 race nvarchar 30 sex nvarchar 10 age int insert into test4 val
  • 选择多列 按一列分组 按计数排序

    我在Oracle中有以下数据集 c1 c2 c3 1A2 cat black 1G2 dog red B11 frog green 1G2 girl red 试图得到以下结果 基本上我首先尝试获取具有重复 c1 的行 c1 c2 c3 1G
  • 如何在Django项目中使用PostgreSQL的存储过程或函数

    我正在开发一个 Django 项目 我决定在 PostgreSQL 中编写逻辑代码 而不是用 Python 编写 因此 我在 PostgreSQL 中创建了一个存储过程 例如 存储过程如下所示 create or replace proce
  • 什么是“数据库实体”以及哪些类型的 DBMS 项目被视为实体? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 3 个表的 SQL 查询(或联接)

    第一次在 Stack Overflow 上问问题 很棒的资源 但是只有一件事真正让我作为 SQL 新手感到困惑 我有三个表 我想获取与鲍勃的学生相关的所有导师的姓名 表 1 教师 ID Name 1 Bob 表 2 学生 STUDENT I
  • SSDT SQL Server 数据库项目中用于架构比较的命令行/API?

    在 Visual Studio 2012 中 我们有Schema Compare http msdn microsoft com en us library hh272690 28v vs 103 29 aspx in SSDT http
  • H2 SQL 日期比较

    在 H2 数据库中 如何在 TIMESTAMP 类型的列上运行查询 SELECT FROM RECORDS WHERE TRAN DATE lt 2012 07 24 Try 2012 07 24
  • 更好地理解 SQL Server 中的架构

    就像标题一样 我还是一个SQLServer菜鸟 当我创建表 Mytable 时 数据库中显示 dbo Mytable 但有人能让我更好地理解模式吗 另外 在 Server 2008 TSQL 一书中 Itzik 说 在你的数据库中 表属于模
  • 从对象定义生成数据库表

    我知道有几种 自动 方法可以创建数据访问层来操作现有数据库 LINQ to SQL Hibernate 等 但我有点厌倦了 我相信应该有更好的做事方式 比如 在 Visio 中创建 更改表 使用 Visio 的 更新数据库 创建 更改数据库
  • 如何用约束标记一大组“传递群”?

    在 NealB解决方案之后进行编辑 与以下解决方案相比 NealB的解决方案非常非常快任何另一个 https stackoverflow com q 18033115 answers and 提出了关于 添加约束以提高性能 的新问题 Nea
  • 如何拥有引用另一个表的检查约束?

    我在 SQL Server 2008 数据库中有以下表 tblItem 其中有一个ItemID field 好项目 它还有一个 ItemID 字段 并且有一个指向 tblItem 的外键 tblBadItem 它也有一个 ItemID 字段
  • AWS RDS MySql - 如何在设置“公开可用”后允许访问

    刚刚使用默认设置和用户 密码创建了新的 AWS RDS MySql 实例 我也将其设置为publicly available并在此过程中创建新的 VPC 目前无法从我的笔记本电脑连接到此 RDS mysql h endpoint u myu
  • 使用来自另一个数据库的选择查询更新 mysql 表

    我有两个数据库 我想用另一个数据库表中的值更新一个表 我正在使用以下查询 但它不起作用 UPDATE database1 table1 SET field2 database2 table1 field2 WHERE database1 t
  • 在Oracle中使用IW和MM

    我使用 IW 表示每周结果 使用 MM 表示每月结果 但我总是收到错误 ORA 00979 not a GROUP BY expression 00979 00000 not a GROUP BY expression 我的疑问是这些 We

随机推荐

  • Laravel 空白白页

    我在群组中的获取路线有问题 这是我的代码 Route group prefix gt commodities function Route get commodities as gt showCommodities uses gt Comm
  • Python格式整数转换为固定长度字符串[重复]

    这个问题在这里已经有答案了 我想根据一个生成一个字符串int和零一起 并且长度应该始终为5不多也不少 For example Consider a Integer 1 Formatted String 00001 Consider a In
  • 什么是私有字节、虚拟字节、工作集?

    我正在尝试使用 perfmon windows 实用程序来调试进程中的内存泄漏 这是 perfmon 对这些术语的解释 工作集是该进程的工作集的当前大小 以字节为单位 工作集是进程中的线程最近接触的内存页集 如果计算机中的可用内存高于阈值
  • 为什么要对参数进行 null 转换? [复制]

    这个问题在这里已经有答案了 何时以及为什么有人会做以下事情 doSomething MyClass null 你曾经这样做过吗 您能分享一下您的经验吗 If doSomething已重载 您需要将 null 显式转换为MyClass因此选择
  • 计算给定月份的前 12 个月 - SimpleDateFormat

    我试图将给定月份 取自数据库 中的前 12 个月放入数组列表中 List
  • 如何强制 Apollo Client 使用缓存数据

    我们有一个最初加载小部件列表的应用程序 query Widgets widgets Widgets fragment Widgets on Widgets name description rootWidget widgets Widget
  • 由于“权限被拒绝”,docker compose down 失败

    跑步时docker compose stop它无法停止 docker 镜像 并给出如下错误 ERROR for nginx cannot stop container 5f5ed6d2110a0d845508ede160d8196d3e01
  • Scrapy + Splash:无法选择元素

    我正在学习使用 scrapy 和splash 作为练习 我正在尝试访问https www ubereats com stores https www ubereats com stores 单击地址文本框 输入位置 然后按 Enter 按钮
  • 运行“npmauditfix--force”会降级反应脚本

    我的 React 项目有一个很大的问题 我正在尝试更新项目中的库 但出现了问题 错误的 这是package json 请注意 react scripts版本设置为 4 0 3 name server version 1 1 0 descri
  • 未能找到构建工具修订版 21.1.1 - sdk 是最新的

    我正在运行 linux android sdk 安装 我的新项目需要构建工具 21 1 1 不知何故 这个构建工具不存在 尽管我的sdk是最新的 但在build tools文件夹中现在有android 4 4W文件夹 android 更新
  • 如何让 CMake 使用系统路径上的默认编译器?

    目前 我从构建目录调用 CMake 如下所示 CXX opt gcc 4 8 bin g cmake 让 CMake 使用这个特定的编译器 否则它使用操作系统默认编译器 我的路径有 opt gcc 4 8 bin那么 有没有办法在 CMak
  • Orchard CMS 中的 Work<> 类有什么用?

    简单明了 它的用例是什么Orchard Environment Work lt gt 类定义于Orchard Environment WorkContextModule cs 它可以在几个地方找到 例如 private readonly W
  • 将排序描述符应用于从模板创建的 NSFetchRequest

    我在核心数据模型中定义了一个名为 RemainingGaneProjections 的提取请求 我想执行该获取请求并按实体的属性之一对结果进行排序 我的代码如下所示 NSFetchRequest projectionsRequest mod
  • 如何防止/检测使用 EXP() 的 Postgresql 计算中的下溢

    在使用 EXP x 函数的查询中 我收到一个值超出范围 来自 pgsql 的下溢错误 x 的什么值会触发此操作 我该如何预防或检测它 函数 exp 称为指数函数 其反函数是自然对数 或以 e 为底的对数 数字 e 通常也被定义为自然对数的底
  • 在 Javascript 中获取查询字符串数组值[重复]

    这个问题在这里已经有答案了 我有一个使用 get 方法并包含一个数组的表单 http www example com name hello name world 我正在尝试使用 JavaScript 或 jQuery 检索数组值 hello
  • Chrome 51 滚动时出现奇怪的框阴影错误

    所以在制作网站时我发现了一个奇怪的box shadowChrome 51 上的错误 我的网站有一个固定标题 其中包含box shadow 当我向上或向下滚动时 框阴影会留下一些标记 水平灰线 我也无法在 jsfiddle 上重现这个错误 小
  • 当方向改变时重新创建活动时,媒体播放器不会加载

    我是新使用表面视图在视频播放器中播放视频的新手 现在我想在重新加载或重新创建视图时方向发生变化时保存媒体播放器的实例状态 然后旧媒体播放器状态从旧位置开始 而不是在零位置加载到原始装置上像屏幕方向一样在清单中设置 但当时 oncreate
  • 是否存在类似 Crashlytics 的 Web 应用服务?

    我是一名 Web 和 iOS 开发人员 在移动设备上 我们有著名的工具来收集应用程序引发的所有异常和错误 Crashlytics 和其他 只需几行代码即可安装 sdk 开始自动跟踪所有内容 然后他们在其网站上显示错误和有用信息以及优先级和其
  • DataGridView 中当前选定行的索引

    就是这么简单 如何获取当前选择的索引Row of a DataGridView 我不想要Row对象 我想要索引 0 n 有的是RowIndex http msdn microsoft com en us library system win
  • 对两个外键约束进行级联删除

    我有以下示例 Table A some id Table B another id Table C some id fk another id fk 我想级联一行Table C如果两者都some id and another id从各自的表