【问题标题】:Delete foreign key referenced table record when setting field to null将字段设置为空时删除外键引用的表记录
【发布时间】:2021-01-21 20:13:21
【问题描述】:

我知道当你有一个外键引用时,你可以做'on delete cascade',如果你删除一个父,子引用也会被删除。

有没有办法在子字段设置为null时删除引用的记录?

Place {
  id (PK)
  name
  id_address (FK)
}

Address {
   id (PK)
   name
   city
}

如果我将 place.id_address 设置为 null,我希望删除地址记录。

这对触发器来说是一个很好的例子吗?我想正确处理这个问题,但我不想在应用层处理它。

【问题讨论】:

  • 没有。 on delete cascade set null
  • 外键不能这样工作。这里,place 是子元素,address 是父元素:使用内置外键选项,当子元素被修改时,不能删除父元素,反之亦然。
  • 这个“当父字段设置为null时,有没有办法删除引用的记录?”与您稍后所说的不匹配:“如果我将 place.id_address 设置为 null,我希望删除地址记录。”当Place 中的子记录将id_address 设置为NULL 时,您要求删除父记录Address。如果那是真的想要那么没有。这在任何情况下都是危险的,因为它会孤立所有其他子记录。
  • @AdrianKlaver 你是对的,我指的是孩子。我明白这会很危险。在这种情况下,最佳做法是什么?如果我将 place.id_address 设置为 null,我会破坏引用,现在我有一个孤立地址。我想自动删除那个孤儿。地址和地点具有一对一的关系,因此任何其他实体都不会使用地址。
  • 删除Place 记录。如果一对一的意思是Address 记录只能有一个Place 记录,那么为什么不将它们合并到一个表中呢?

标签: sql postgresql


【解决方案1】:

我认为最好的解决方案是这样的触发器:

CREATE FUNCTION del_addr() RETURNS trigger
   LANGUAGE plpgsql AS
$$BEGIN
   DELETE FROM address WHERE address.id = OLD.address_id;
   RETURN OLD;
END;$$;

CREATE TRIGGER del_addr AFTER DELETE ON place
   FOR EACH ROW EXECUTE PROCEDURE del_addr();

【讨论】:

    猜你喜欢
    • 2014-01-03
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多