postgresql - 在 PostgreSQL 中删除跨表的链接数据

标签 postgresql database-design cascading-deletes

我正在寻找处理跨三个 PostgreSQL 表删除链接数据的最佳方法(技术上更多,但它是相同的想法)。

三个表分别是agency、address和agency_address。一个机构可以有多个地址,所以 agency_address 只是一个链接表,有两列, agency_id 和 address_id (定义为它们各自的外键)

我想设置它,以便在删除代理机构时,它会自动删除 agency_address 中的链接表行和相关地址行。 (所以如果一个机构被删除,它的所有地址也会被删除)

我可以得到它来清除链接表,但不确定如何到达地址表。

(地址也是一个通用模型,将被其他人引用,例如将有自己的链接表的“站点”。)

最佳答案

使用外键 ON DELETE CASCADE在表定义中。

ALTER TABLE agency_address
  ADD CONSTRAINT agency_address_agency_fkey FOREIGN KEY (agency_id)
      REFERENCES agency (agency_id) ON DELETE CASCADE;

似乎不确定您是否也应该自动删除地址。

如果是这样,你的数据模型是错误的,地址应该直接依赖于机构,外键约束类似于上面的约束,不需要 n:m 链接表。


获取更多信息后编辑:

因此,地址可以链接到代理机构或网站,但绝不能同时链接到这两者。

该模型可以像您拥有的那样工作,但您必须以某种方式确保链接到代理机构的地址也不会链接到网站。

addressagency_address 之间的外键约束指向“错误”方向,因此您不能简单地添加另一个 ON DELETE CASCADE。您可以使用额外的外键来实现它,但这很棘手。这种每个触发器的方法要简单得多:

CREATE OR REPLACE FUNCTION trg_agency_address_delaft()
  RETURNS trigger AS
$BODY$
BEGIN

DELETE FROM address
WHERE address_id = OLD.address_id;

END;
$BODY$
  LANGUAGE plpgsql;


CREATE TRIGGER delaft
  AFTER DELETE ON agency_address
  FOR EACH ROW EXECUTE PROCEDURE trg_agency_address_delaft();

更多关于 trigger functionstriggers在手册中。

关于postgresql - 在 PostgreSQL 中删除跨表的链接数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8761637/

相关文章:

parent-child - JOOQ CASCADE 删除

sql - Postgres如何在查询中使用点类型

database-design - 多表或多模式

mysql - 试图找出一个好的数据库设计

android - 有类似 "ON DELETE NULL"的东西吗?

mysql - 获取 "cascade-deleted"行的表/主键

sql - 使用 rpad 填充 Postgresql 中的字符串而不截断它

结果集错误 : Issue knitting RMarkdown with SQL connection

postgresql - 无法在 Docker 中更改 PostgreSQL 的管理员用户密码

MySQL 日期时间索引不起作用