Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server-循环级联路径_Sql Server_Foreign Keys_Entity Relationship_Jointable_Table Relationships - Fatal编程技术网

Sql server SQL Server-循环级联路径

Sql server SQL Server-循环级联路径,sql-server,foreign-keys,entity-relationship,jointable,table-relationships,Sql Server,Foreign Keys,Entity Relationship,Jointable,Table Relationships,假设我有两个表-User和Post 我引入了一个定制的联接表Vote,以便在User和Post之间建立多对多关系 这些表格的结构如下: 用户(UseId,名称) 发布(发布ID、用户ID、内容) 投票(Id、用户Id、PostId、值) 注: 每个表的强调列都是一个PK Post中的UserId是一个FKtoUser表 Vote表中的UserId和PostId列位于 各表 其他列如Value、Content、Name等都是varchar 考虑到上述设计是合适的(如果不是,欢迎建议:)

假设我有两个表-UserPost

我引入了一个定制的联接表Vote,以便在UserPost之间建立多对多关系

这些表格的结构如下:

  • 用户(UseId,名称)
  • 发布(发布ID、用户ID、内容)
  • 投票(Id、用户Id、PostId、值)
注:

  • 每个表的强调列都是一个
    PK
  • Post中的
    UserId
    是一个
    FK
    toUser
  • Vote表中的
    UserId
    PostId
    列位于 各表
  • 其他列如
    Value
    Content
    Name
    等都是varchar

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

我想要的是:

  • 如果删除了Post表中的一行,则还应删除Vote中的相关行
  • 如果删除了用户表中的一行,则还应删除投票中的相关行
  • 如果删除了User表中的一行,则Post中相关行的
    UserId
    列应设置为NULL
  • 我能在没有任何循环冗余的情况下实现这种关系吗?如果是,如何进行


    更新:


    如果您也遇到过多个级联路径,请查看这一令人敬畏的消息:

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

    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;
    

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

    或者只是删除触发器


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

    您忘记了
    引用部分,或者我遗漏了什么?@MikeNakis。谢谢你。@GordonLinoff我尝试了级联外键,但最终导致循环冗余。我会按你的方式试试看:)@GordonLinoff它确实有效,谢谢!我把人际关系搞砸了,陷入了循环路径。。现在完成了..@VijayChavda。很高兴我能帮忙。外键关系可能会变得混乱,尤其是当您试图管理多个关系时。