1

我之前问过这个问题,但答案不是我想要的。

我在没有使用代码的情况下在 Asp.net 中创建了一个表。它包含两列。

YourUserId 和 FriendUserId

这是多对多的关系。

这是我想要的:

可以有多个记录以您的名字作为 UserId,也可以有多个记录 FriendUserId 相同...但不能有多个记录两者都相同。例如:

戴夫:格雷格

戴夫:克里斯

格雷格:克里斯

克里斯:格雷格

很好

戴夫:格雷格

戴夫:格雷格

不好。

我右键单击表格并选择索引/键。然后,我将两列都放在列部分并选择使其唯一。我认为这会使它们作为一个整体独一无二,但单独不是独一无二的。

如果您转到数据集,它会在两列旁边显示键,并表示检查两列时存在约束。

有没有一种方法可以确保您没有将记录的重复副本插入到表中而没有单个列是唯一的?

我尝试用我的 sql insert 语句来控制它,但没有奏效。这是我尝试过的。

在不存在的情况下插入 [FriendRequests] ([UserId], [FriendUserId]) 值 ('"+UserId+"', '"+PossibleFriend+"') (SELECT [UserId], [FriendUserId] FROM [FriendRequests])

由于某种原因,这不起作用。感谢您的帮助!

4

3 回答 3

3

您应该创建一个复合主键以防止重复行。

ALTER TABLE FriendRequests
ADD CONSTRAINT pk_FriendRequests PRIMARY KEY (UserID, FriendUserID)

或者在表格设计器中选择两列并右键单击以将其设置为键。

为了防止自我友谊,您将创建一个CHECK约束:

ALTER TABLE FriendRequests
ADD CONSTRAINT ck_FriendRequests_NoSelfFriends CHECK (UserID <> FriendUserID)

您可以通过右键单击表设计器中的任意位置,单击“检查约束”,单击“添加”,并将表达式设置为来在设计器中添加检查约束UserID <> FriendUserID

你可能想看看这个问题

于 2009-04-02T17:39:00.680 回答
1

听起来您需要一个复合键才能使两个字段成为一个键。

于 2009-04-02T17:38:48.917 回答
0

我有一个更好的主意。创建一个新表。称为 FriendRequestRelationships。有以下列

FriendRelationshipId(主键) UserId_1(外键约束) UserId_2(外键约束)

放置一个唯一约束以仅允许与 UserId_1 和 UserId_2 的一个关系。该表现在用作您的多对多关系工具。

创建一个可以返回 UserId 的 FriendUserId 的标量函数,假设它被称为 fn_GetFriendUserIdForUserId

您现在可以通过运行以下查询来显示您的关系

从 FriendRelationshipId 中选择 dbo.fn_GetFriendUserIdForUserId(UserId_1) 作为“Friend1”,dbo.fn_GetFriendUserIdForUserId(UserId_2) 作为“Friend2”

于 2009-04-02T17:45:27.747 回答