SQL 服务器 - 循环级联路径
SQL Server - Cyclic Cascade Path
假设我有两个 tables - User 和 Post
我引入了自定义的 Join table Vote 以在 User 和 Post.
table 具有以下结构:
- 用户(UseId,姓名)
- Post (PostId, UserId, Content)
- 投票(Id, UserId, PostId, Value)
备注:
- 每个table的强调列是
PK
。
- Post中的
UserId
是FK
到用户table.
- 投票table中的
UserId
和PostId
列FK
各自的 tables。
- 其他列如
Value
、Content
、Name
等都是varchar。
考虑到上面的设计是合适的(如果不合适,欢迎提出建议:)......
我要的是:
- 如果PostTable中的一行被删除,投票中的相关行也应该被删除已删除。
- 如果 User Table 中的一行被删除,Vote 中的相关行也应该被删除。
- 如果 User Table 中的一行被删除,Post[= 中相关行的
UserId
列76=] 应设置为 NULL。
我可以在没有任何 Cyclic-Redundancy
的情况下建立这种关系吗?如果是,怎么做?
更新:
看看这个很棒的 answer 如果您也遇到过多个级联路径:
您正在寻找级联外键关系。对于前两个:
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 中有解释。
一种方法是向每个 table 添加 isdeleted bit, changed datetime
列,并使用触发器在删除时更新列值。在这种情况下,您将保留您的投票、帖子和用户的历史记录。
或者只是删除触发器。
或者使用 Gordon Linoff 发布的级联关系。
假设我有两个 tables - User 和 Post
我引入了自定义的 Join table Vote 以在 User 和 Post.
table 具有以下结构:
- 用户(UseId,姓名)
- Post (PostId, UserId, Content)
- 投票(Id, UserId, PostId, Value)
备注:
- 每个table的强调列是
PK
。 - Post中的
UserId
是FK
到用户table. - 投票table中的
UserId
和PostId
列FK
各自的 tables。 - 其他列如
Value
、Content
、Name
等都是varchar。
考虑到上面的设计是合适的(如果不合适,欢迎提出建议:)......
我要的是:
- 如果PostTable中的一行被删除,投票中的相关行也应该被删除已删除。
- 如果 User Table 中的一行被删除,Vote 中的相关行也应该被删除。
- 如果 User Table 中的一行被删除,Post[= 中相关行的
UserId
列76=] 应设置为 NULL。
我可以在没有任何 Cyclic-Redundancy
的情况下建立这种关系吗?如果是,怎么做?
更新:
看看这个很棒的 answer 如果您也遇到过多个级联路径:
您正在寻找级联外键关系。对于前两个:
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 中有解释。
一种方法是向每个 table 添加 isdeleted bit, changed datetime
列,并使用触发器在删除时更新列值。在这种情况下,您将保留您的投票、帖子和用户的历史记录。
或者只是删除触发器。
或者使用 Gordon Linoff 发布的级联关系。