之前我问过这个问题,但答案不是我想要的。
我在不使用代码的情况下在Asp.net中创建了一个表。它包含两列。
YourUserId和FriendUserId
这是一对多关系。
继承人我想要的东西:
可以有多个记录,您的名称为UserId,也可能有多个记录与FriendUserId相同...但不能有多个记录,两者都是相同的。例如:
戴夫:格雷格 戴夫:克里斯 格雷格:克里斯 克里斯:格雷格很好
戴夫:格雷格 戴夫:格雷格不好。
我右键单击表格并选择了索引/键。然后我将两列放在列部分中并选择使其成为唯一的。我认为这会使它们作为一个整体变得独一无二,但并不是唯一的。
如果你转到数据集,它会显示两列旁边的键,并表示存在约束,同时检查两列。
有没有办法确保您没有在表中插入重复的记录副本而没有单独的列是唯一的?
我尝试使用我的sql insert语句来控制它,但这不起作用。这就是我的尝试。
INSERT INTO [FriendRequests]([UserId],[FriendUserId])VALUES('“UserId +”','“+ PossibleFriend +”')不存在(从[FriendRequests]中选择[UserId],[FriendUserId])
由于某种原因,这不起作用。 谢谢你的帮助!
答案 0 :(得分: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
您可能需要查看this question
答案 1 :(得分:1)
听起来你需要一个复合键才能使两个字段都成为一个键。
答案 2 :(得分:0)
我有一个更好的主意。创建一个新表。被称为FriendRequestRelationships。有以下列
FriendRelationshipId(PRIMARY KEY) UserId_1(外键约束) UserId_2(外键约束)
将唯一约束设置为仅允许UserId_1和UserId_2之间的一个关系。此表现在可用作多对多关系。
创建一个可以返回UserId的FriendUserId的标量函数,假设它叫做fn_GetFriendUserIdForUserId
现在,您可以通过运行以下查询来显示您的关系
SELECT dbo.fn_GetFriendUserIdForUserId(UserId_1)AS'Friend1', dbo.fn_GetFriendUserIdForUserId(UserId_2)AS'Friend2', 来自FriendRelationshipId