Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.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
Asp.Net SQL中的唯一记录_Asp.net_Sql_Unique_Record - Fatal编程技术网

Asp.Net SQL中的唯一记录

Asp.Net SQL中的唯一记录,asp.net,sql,unique,record,Asp.net,Sql,Unique,Record,我以前问过这个问题,但答案不是我想要的 我在Asp.net中创建了一个表,没有使用代码。它包含两列 YourUserId和FriendUserId 这是一种多对多的关系 这是我想要的: 可以有多条记录的用户名为您的姓名,也可以有多条记录的FriendUserId相同……但不能有多条记录的用户名和FriendUserId相同。例如: 戴夫:格雷格 戴夫:克里斯 格雷格:克里斯 克里斯:格雷格 很好 戴夫:格雷格 戴夫:格雷格 这不好 我右键单击表并选择索引/键。然后,我将这两列都放在columns

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

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

YourUserId和FriendUserId

这是一种多对多的关系

这是我想要的:

可以有多条记录的用户名为您的姓名,也可以有多条记录的FriendUserId相同……但不能有多条记录的用户名和FriendUserId相同。例如:

戴夫:格雷格

戴夫:克里斯

格雷格:克里斯

克里斯:格雷格

很好

戴夫:格雷格

戴夫:格雷格

这不好

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

如果转到数据集,它会在两列旁边显示键,并表示两列都被选中时存在约束

是否有一种方法可以确保在没有单个列唯一的情况下,不会将记录的重复副本插入表中

我试着用我的sql insert语句控制它,但没有成功。这就是我试过的

在不存在的[FriendRequests]([UserId]、[FriendUserId])值(“+UserId+”、“+PossibleFriend+”)中插入(从[FriendRequests]中选择[UserId]、[FriendUserId])

因为某种原因,这不起作用。
谢谢你的帮助

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

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

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

ALTER TABLE FriendRequests
ADD CONSTRAINT pk_FriendRequests PRIMARY KEY (UserID, FriendUserID)
或者在表设计器中选择两列,然后右键单击将其设置为键

为了防止自交,您需要创建一个
检查
约束:

ALTER TABLE FriendRequests
ADD CONSTRAINT ck_FriendRequests_NoSelfFriends CHECK (UserID <> FriendUserID)
ALTER表请求
添加约束ck\u FriendRequests\u NoSelfFriends检查(UserID-FriendUserID)
通过右键单击表设计器中的任意位置,单击“检查约束”,单击“添加”,并将表达式设置为
UserID-FriendUserID


您可能想看看

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

ALTER TABLE FriendRequests
ADD CONSTRAINT pk_FriendRequests PRIMARY KEY (UserID, FriendUserID)
或者在表设计器中选择两列,然后右键单击将其设置为键

为了防止自交,您需要创建一个
检查
约束:

ALTER TABLE FriendRequests
ADD CONSTRAINT ck_FriendRequests_NoSelfFriends CHECK (UserID <> FriendUserID)
ALTER表请求
添加约束ck\u FriendRequests\u NoSelfFriends检查(UserID-FriendUserID)
通过右键单击表设计器中的任意位置,单击“检查约束”,单击“添加”,并将表达式设置为
UserID-FriendUserID


你可能想看看

我有个更好的主意。创建一个新表。称为友谊关系。有以下列

FriendRelationshipId(主键) 用户ID_1(外键约束) UserId_2(外键约束)

设置一个唯一的约束,只允许一个具有UserId_1和UserId_2的关系。此表现在充当多对多关系工具

创建一个标量函数,该函数可以返回用户ID的FriendUserId,比如说它被称为fn_GetFriendUserIdForUserId

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

选择dbo.fn_GetFriendUserIdForUserId(UserId_1)作为“Friend1”, dbo.fn_GetFriendUserIdForUserId(UserId_2)作为“Friend2”,
从Friendsrelationship我有一个更好的主意。创建一个新表。称为友谊关系。有以下列

FriendRelationshipId(主键) 用户ID_1(外键约束) UserId_2(外键约束)

设置一个唯一的约束,只允许一个具有UserId_1和UserId_2的关系。此表现在充当多对多关系工具

创建一个标量函数,该函数可以返回用户ID的FriendUserId,比如说它被称为fn_GetFriendUserIdForUserId

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

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

由于我没有以那种方式创建表,因此没有代码,您如何做到这一点?创建没有代码的表是一种糟糕的设计吗?您仍然可以使用代码更改表。但正如我所说的,打开表格设计器,选择两列并右键单击设置为键。很抱歉,在您键入答案之前我发表了评论…谢谢!顺便说一句,没问题,我更新了答案,添加了如何在设计视图中对表创建检查约束?如果您的意思是在表定义中,则不能同时选择两个表。但是,我确实通过右键单击表并选择键创建了一个约束。我添加了两个列并将其设置为unique,但它不起作用。如果没有代码,您如何做到这一点,因为我没有以这种方式创建表?创建没有代码的表是一种糟糕的设计吗?您仍然可以使用代码更改表。但正如我所说的,打开表格设计器,选择两列并右键单击设置为键。很抱歉,在您键入答案之前我发表了评论…谢谢!顺便说一句,没问题,我更新了答案,添加了如何在设计视图中对表创建检查约束?如果您的意思是在表定义中,则不能同时选择两个表。但是,我确实通过右键单击表并选择键创建了一个约束。我添加了两个列并设置为唯一,它不起作用我不清楚问题出在哪里。听起来好像您创建了一个复合键。你有错误吗?您是否能够插入重复的行?如果您已经提出了此问题,请尝试澄清您的问题