Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PostgreSQL中跨表删除链接数据_Postgresql_Database Design_Cascading Deletes - Fatal编程技术网

在PostgreSQL中跨表删除链接数据

在PostgreSQL中跨表删除链接数据,postgresql,database-design,cascading-deletes,Postgresql,Database Design,Cascading Deletes,我正在寻找处理跨三个PostgreSQL表删除链接数据的最佳方法(技术上更多,但想法相同) 这三个表是agency、address和agency_address。一个代理可以有多个地址,所以代理地址只是一个链接表,有两列,代理id和地址id(定义为各自的外键) 我想对其进行设置,以便在删除代理时自动删除代理地址中的链接表行和相关地址行。(因此,如果某个机构被删除,其所有地址也将被删除) 我可以让它清除链接表,但不确定如何到达地址表 (地址也是一个通用模型,将被其他人引用,例如“站点”将有自己的链

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

这三个表是agency、address和agency_address。一个代理可以有多个地址,所以代理地址只是一个链接表,有两列,代理id和地址id(定义为各自的外键)

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

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

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

在表定义中使用外键

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\u address
之间的外键约束指向“错误”方向,因此您不能简单地在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();
有关和的详细信息,请参阅手册。

在表定义中使用外键

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\u address
之间的外键约束指向“错误”方向,因此您不能简单地在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();

有关和的更多信息,请参见手册。

您的描述相互矛盾:如果其他人引用地址
,则您不应将“删除代理”级联到所有链接地址。它们可以链接到其他对象(代理?)。对不起,地址表(对象)本身将被其他对象使用。就像一个站点会使用地址表中存储的地址一样,但它是唯一的。我们不允许两个不同的东西,无论是两个+代理,一个站点和一个代理,还是两个+站点,使用相同的地址。您的描述是矛盾的:如果地址
将被其他人引用,那么您不应该将对代理的删除级联到所有链接的地址。它们可以链接到其他对象(代理?)。对不起,地址表(对象)本身将被其他对象使用。就像一个站点会使用地址表中存储的地址一样,但它是唯一的。我们不允许两个不同的东西,无论是两个+代理,一个站点和一个代理,还是两个+站点,使用相同的地址。我们的想法是使用一个地址表来存储不同资源的所有地址。(例如,代理机构和站点的地址,两者都可以有多个)这使我们可以为我们的地址创建一个模型/对象,供我们的代理机构和站点对象使用。address对象不关心谁/什么在使用它,它只管理address表中的内容。代理对象看到/知道它有N个地址,并创建了那么多地址对象。是否最好有单独的地址表,并扩展机构和站点的地址对象以使用不同的表?@jshrc:我在我的回答中添加了一个可能的解决方案。其想法是使用一个地址表来存储不同资源的所有地址。(例如,代理机构和站点的地址,两者都可以有多个)这使我们可以为我们的地址创建一个模型/对象,供我们的代理机构和站点对象使用。address对象不关心谁/什么在使用它,它只管理address表中的内容。代理对象看到/知道它有N个地址,并创建了那么多地址对象。是否最好有单独的地址表,并扩展机构和站点的地址对象以使用不同的表?@jshrc:我在回答中添加了一个可能的解决方案。