我正在寻找处理跨三个PostgreSQL表删除链接数据的最佳方法(技术上更多,但它的想法相同)。
这三个表是代理商,地址和代理商地址。代理商可以拥有多个地址,因此agency_address只是一个包含两列的链接表,即agency_id和address_id(定义为各自的外键)
我想进行设置,以便在删除代理商时,它会自动删除agency_address中的链接表行和相关的地址行。 (因此,如果代理商被删除,其所有地址也将被删除)
我可以让它清除链接表,但不知道如何到达地址表。
(地址也是通用模型,将被其他人引用,例如“网站”,它们将拥有自己的链接表。)
答案 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链接表。
因此,地址可以链接到代理商或网站,但不能同时链接到两者。
模型可以正常工作,但您必须确保链接到代理商的地址也不会链接到某个网站。
address
和agency_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 functions和triggers的更多信息。