【问题标题】:PostgreSQL - delete all post reactions when deleting a post?PostgreSQL - 删除帖子时删除所有帖子反应?
【发布时间】:2021-07-09 03:27:59
【问题描述】:

由于将post.idpost_reaction.post_id 关联的外键,我无法删除有反应(喜欢)的帖子。

我想在删除时使用 CASCADE 创建一个外键,但是因为一个帖子可以有很多 post_reactions,我收到一个错误:no unique constraint matching given keys for referenced table "post_reactions"

我不应该认为我必须在客户端单独删除所有内容,是吗?即先删除所有 post_reactions,然后删除帖子?

  const handleDeletePost = () => {
    if (postImageRelayId) {
      ImageDeleteMutation(postImageRelayId); // if there is an image, delete it
    }
    if (postReactions.length) {
      PostReactionDeleteMutation(postReactions); // if there are reactions, delete all of them
    }
    PostDeleteMutation(post.id, currentPerson); // delete post itself
  };

图像表有一个 post_id 列,其 fkey 指向 post.id

post_reactions 表有一个 post_id 列,也有一个指向 post.id 的 fkey

我想简单地从帖子表中删除帖子,postgres CASCADE 删除任何具有该 post_id 的反应和/或图像,但是,我无法在引用 post_reactions 的帖子表上创建外键.post_id

【问题讨论】:

标签: sql postgresql graphql


【解决方案1】:

外键必须从post_reactions 指向posts,而不是相反,因为您的错误消息表明您尝试这样做。

【讨论】:

  • 就是这样。如果我尝试删除帖子而不首先删除与其具有该 fkey 关系的反应,则删除失败。我希望有一种方法可以告诉 postgres 删除外部表中具有指向帖子 ID 的 fkey 的任何行。
【解决方案2】:

我误解了 CASCADE。我认为 CASCADE 需要在 post 表而不是 post_reactions 表上。

我将它添加到 post_reactions_post_id fkey 中,它现在可以工作了。

ALTER TABLE wuddit.post_reactions
    ADD CONSTRAINT post_reactions_post_id_fkey FOREIGN KEY (post_id)
    REFERENCES wuddit.post (id) MATCH SIMPLE
    ON UPDATE NO ACTION 
    ON DELETE CASCADE; // this

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    • 2019-09-28
    • 2017-10-05
    • 1970-01-01
    • 2017-07-03
    • 2018-05-05
    • 2014-04-20
    相关资源
    最近更新 更多