我正在寻找处理跨三个 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 链接表。
获取更多信息后编辑:
因此,地址可以链接到代理机构或网站,但绝不能同时链接到这两者。
该模型可以像您拥有的那样工作,但您必须以某种方式确保链接到代理机构的地址也不会链接到网站。
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在手册中。
关于postgresql - 在 PostgreSQL 中删除跨表的链接数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8761637/