我想删除包含外键的行,但是当我尝试这样的事情时:
DELETE FROM osoby WHERE id_osoby='1'
我得到这个声明:
错误:表“osoby”上的更新或删除违反了表“kontakty”上的外键约束“kontakty_ibfk_1”详细信息:键(id_osoby)=(1)仍然从表“kontakty”中引用。
如何删除这些行?
原文由 Michal Loksik 发布,翻译遵循 CC BY-SA 4.0 许可协议
我想删除包含外键的行,但是当我尝试这样的事情时:
DELETE FROM osoby WHERE id_osoby='1'
我得到这个声明:
错误:表“osoby”上的更新或删除违反了表“kontakty”上的外键约束“kontakty_ibfk_1”详细信息:键(id_osoby)=(1)仍然从表“kontakty”中引用。
如何删除这些行?
原文由 Michal Loksik 发布,翻译遵循 CC BY-SA 4.0 许可协议
1 回答2.4k 阅读✓ 已解决
1 回答2.3k 阅读✓ 已解决
3 回答2.3k 阅读
2 回答945 阅读
要自动执行此操作,您可以使用
ON DELETE CASCADE
定义外键约束。我引用了 外键约束的手册:
像这样查找当前的 FK 定义:
然后在如下语句中添加或修改
ON DELETE ...
部分到ON DELETE CASCADE
(保留其他所有内容):没有
ALTER CONSTRAINT
命令。在单个ALTER TABLE
语句中删除并重新创建约束以避免并发写访问可能出现的竞争条件。显然,您需要特权才能这样做。该操作需要一个
ACCESS EXCLUSIVE
锁定表kontakty
和一个SHARE ROW EXCLUSIVE
锁定表osoby
如果您不能
ALTER
表,则手动(一次)或通过触发器删除BEFORE DELETE
(每次)是剩余的选项。