【问题标题】:SQL Server - Cyclic Cascade PathSQL Server - 循环级联路径
【发布时间】:2017-02-09 23:31:06
【问题描述】:

假设我有两个表 - UserPost

我引入了一个自定义的 Join 表 Vote,以便在 UserPost 之间建立多对多的关系。

表格具有以下结构:

  • 用户UseId,姓名)
  • 发布PostId、UserId、内容)
  • 投票Id、UserId、PostId、Value)

注意事项:

  • 每个表的强调列是PK
  • Post 中的UserId 是一个FKUser 表。
  • Vote 表中的UserIdPostId 列是FK 相应的表。
  • ValueContentName 等其他列都是 varchar。

考虑到上面的设计是合适的(如果不合适,欢迎提出建议:).....

我想要的是:

  1. 如果Post表中的一行被删除,Vote中的相关行也应该被删除。
  2. 如果User表中的一行被删除,Vote中的相关行也应该被删除。
  3. 如果User表中的一行被删除,Post中相关行的UserId列应设置为NULL。

我可以在没有Cyclic-Redundancy 的情况下建立这种关系吗?如果是,如何?


更新:

如果您也遇到过多个级联路径,请查看这个很棒的 answer

【问题讨论】:

    标签: sql-server foreign-keys entity-relationship jointable table-relationships


    【解决方案1】:

    您正在寻找级联外键关系。对于前两个:

    alter table vote
        add constraint fk_vote_user
            foreign key (userid) references user(userid) on delete cascade;
    
    alter table vote
        add constraint fk_vote_post
            foreign key (postid) references post(postid) on delete cascade;
    

    第三个:

    alter table post
        add constraint fk_post_user
            foreign key (userid) references user(userid) on delete set null;
    

    这些在documentation中有解释。

    【讨论】:

    • 你忘记了references 部分,还是我遗漏了什么?
    • @MikeNakis。 . .谢谢。
    • @GordonLinoff 我尝试了级联外键,但最终得到了循环冗余。我会按照你的方式试试看:)
    • @GordonLinoff 它确实有效,谢谢!我搞砸了关系并陷入了循环路径..现在完成了..
    • @VijayChavda 。 . .很高兴我能帮助你。外键关系可能会令人困惑,尤其是在您尝试管理多个关系时。
    【解决方案2】:

    一种方法是在每个表中添加isdeleted bit, changed datetime 列,并使用触发器在删除时更新列值。在这种情况下,您将保留您的投票、帖子和用户的历史记录。

    或者只是在删除触发器上。

    或者使用 Gordon Linoff 发布的级联关系。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-10
      • 2023-03-09
      • 2016-10-20
      • 2011-02-06
      • 2019-10-20
      相关资源
      最近更新 更多