【问题标题】:Unique record in Asp.Net SQLAsp.Net SQL 中的唯一记录
【发布时间】:2009-04-02 17:34:33
【问题描述】:

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

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

YourUserId 和 FriendUserId

这是多对多的关系。

这是我想要的:

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

戴夫:格雷格

戴夫:克里斯

格雷格:克里斯

克里斯:格雷格

不错

戴夫:格雷格

戴夫:格雷格

不好。

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

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

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

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

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

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

【问题讨论】:

  • 我不清楚问题是什么。听起来您创建了一个复合键。你有错误吗?你能插入重复的行吗?
  • 如果你已经问过这个问题,那么试着在人们问到的时候澄清你原来的问题,而不是创建一个新的问题来弄乱董事会。 stackoverflow.com/questions/707767/sql-unique-record-not-column

标签: asp.net sql unique record


【解决方案1】:

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

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

或者在表格设计器中选择两列,然后右键设置为键。

为了防止自交,你需要创建一个CHECK 约束:

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

您可以在设计器中添加检查约束,方法是右键单击表格设计器中的任意位置,单击“检查约束”,单击“添加”,并将表达式设置为UserID &lt;&gt; FriendUserID

你可能想看看this question

【讨论】:

  • 您如何在没有代码的情况下做到这一点,因为我没有以那种方式创建表格?不用代码创建表格是不是不好的设计?
  • 您仍然可以使用代码更改表格。但是正如我所说,打开表格设计器,选择两个列并右键单击以设置为键。
  • 对不起,在您输入答案之前我发表了评论...谢谢!
  • 没问题,顺便说一句,我更新了答案以添加如何在设计视图中对表创建检查约束。
  • 你说的表设计器是指在数据集文件中吗?如果您的意思是在表定义中,则不能同时选择两个表。但是,我确实通过右键单击表并选择键来创建约束。我添加了两列并设置为唯一,它不起作用
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    设置一个唯一约束,只允许与 UserId_1 和 UserId_2 建立一个关系。此表现在用作您的多对多关系工具。

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

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

    选择 dbo.fn_GetFriendUserIdForUserId(UserId_1) AS 'Friend1', dbo.fn_GetFriendUserIdForUserId(UserId_2) AS 'Friend2', FROM FriendRelationshipId

    【讨论】:

      猜你喜欢
      • 2010-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多