级联删除产品并在所有表中按ID删除

时间:2019-03-20 04:59:15

标签: sql postgresql

我有一个产品表。我要删除产品,我也想从浮动广告中删除此产品,从表格和评论表格中删除喜欢的内容。

DELETE FROM COMMENTS WHERE PRODUCT_ID = 1;
DELETE FROM LIKES_PRODUCTS WHERE PRODUCT_ID = 1;
DELETE FROM BOOKMARKS_PRODUCTS WHERE PRODUCT_ID = 1;
DELETE FROM PRODUCTS WHERE PRODUCT_ID = 1;

事实是产品表与该表的主键相关联。如何整合这些查询并执行级联删除?

1 个答案:

答案 0 :(得分:2)

您可以将级联删除约束添加到其他表。例如,在COMMENTS表上尝试以下操作:

ALTER TABLE COMMENTS ADD FOREIGN KEY(id_fk) REFERENCES PRODUCTS (PRODUCT_ID)
ON DELETE CASCADE;

重要的是,在尝试之前,请在 之前添加此约束:

DELETE FROM PRODUCTS WHERE PRODUCT_ID = 1;

这样做的原因是,如果您删除PRODUCTS表中的父记录,然后尝试将约束添加到子表中,则会出现错误。发生此错误的原因是,现在有子记录指向父记录不再存在。如果您确实遇到了这种情况,则可以通过从其他表中手动删除子记录来解决此问题。

有了此约束,删除PRODUCT_ID = 1表中的PRODUCTS也将导致COMMENTS表中所有匹配的记录也被删除。

还可以使用具有外部约束的CREATE TABLE语句来定义表。但是,由于您的表已经存在,因此我上面给出的ALTER TABLE选项可能对您更有用。