在PostgreSQL中删除表中的链接数据

时间:2012-01-06 17:12:37

标签: postgresql database-design cascading-deletes

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

这三个表是代理商,地址和代理商地址。代理商可以拥有多个地址,因此agency_address只是一个包含两列的链接表,即agency_id和address_id(定义为各自的外键)

我想进行设置,以便在删除代理商时,它会自动删除agency_address中的链接表行和相关的地址行。 (因此,如果代理商被删除,其所有地址也将被删除)

我可以让它清除链接表,但不知道如何到达地址表。

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

1 个答案:

答案 0 :(得分:0)

在表定义中使用带有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的更多信息。