【发布时间】: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