为多行SQL创建唯一ID

问题描述 投票:1回答:7

我有很多用户ID。我将这些插入到一个组表中,该表将包含用户ID和组ID的列。这将允许我使用查询“SELECT user_id FROM groups WHERE group_id ='3';”检索组3的所有成员的用户ID。

我的问题是我目前有一个所有用户ID的列表,我从表单中使用以下语句获得:

int i = 0;
String[] names = { Request.Form["usernames"]Split(' ') }; //retrieving names from form
List<int> user_ids = new List<int>();
foreach(string name in names){ 
    int user_id = db.QueryValue("SELECT user_id FROM users WHERE username = name");
    user_ids.Add(user_id); //now I have a list of all user_ids
}

我现在希望将此数据插入到groups表中,其中列表中的所有user_id值将具有相同的group_ID。我怎样才能做到这一点?

//create a group from users
"INSERT INTO group (group_id, user_id) VALUES(?,?);
c# sql sql-server database database-design
7个回答
4
投票

你在说什么是很多关系。您已有用户表:

**users**
userid
username

你需要在中间增加一张桌子。组表只有以下内容:

**group***
groupid
groupName

然后你会在中间有一张桌子。这个表看起来像这样:

**user_groups**
userid
groupid

您仍然可以使用您的代码插入用户,

int i = 0;
String[] names = { Request.Form["usernames"]Split(' ') }; //retrieving names from form
List<int> user_ids = new List<int>();
foreach(string name in names){ 
    int user_id = db.QueryValue("SELECT user_id FROM users WHERE username = name");
    user_ids.Add(user_id); //now I have a list of all user_ids
}

在此之后,您将插入一个组:

insert into group(groupName) values("Sample Group")

然后,您可以检索组ID并使用它来插入user_groups

select groupid from group where groupname="Sample Group"

insert into user_groups(userid,groupid) values(...

此外,表结构应包括主键和外键(很像@sixlettervariables'的答案)


2
投票

为了使这个更干净,您可能希望稍微重构数据库设置,以便第三个表将用户与组相关联:

users      (user_id pk, ...)
groups     (group_id pk, ...)
membership (user_id fk, group_id fk) unique(user_id, group_id)

当您需要创建一个新组时,只需插入groups表,获取group_id,然后使用该表填充该组中每个用户的membership表。


0
投票

您可以使用select作为插入的输入

INSERT INTO group (group_id, user_id)
SELECT 1, user_id FROM users WHERE username in ("name1", name2")

您可以使用逗号将names数组连接起来。


0
投票

您将需要迭代user_ids列表并为每个用户ID执行单独的insert语句。


0
投票

您可以使用sub-select和union语句将一个表中的所有用户ID插入另一个表中,如下所示:

INSERT INTO group_table_name([user_id]) SELECT [user_id] FROM table_name
UNION ALL

顺便说一句,您可能希望更改该表名,因为“group”是SQL Server中的关键字。只是一个提示。


0
投票

插入GroupTable(GroupId,UserID)按GroupID,UserID从UserTable组中选择GroupID,USerID)

这会工作:)


0
投票

假设您已经知道3,您可以在不将用户ID拉入本地列表然后单独插入它们的情况下执行此操作(特别是因为OP在类似字符串中有查询而放入引号):

"INSERT dbo.group(group_id, user_id) 
   SELECT 3, user_id 
   FROM dbo.users 
   WHERE username = name;"

如果您还不知道组ID,请说明您如何确定组ID应为3。

编辑基于进一步的信息。

CREATE TABLE dbo.Groups
(
  GroupID INT IDENTITY(1,1) PRIMARY KEY, 
  GroupName NVARCHAR(255) NOT NULL UNIQUE
);

CREATE TABLE dbo.GroupUsers
(
  GroupID INT NOT NULL FOREIGN KEY
    REFERENCES dbo.Groups(GroupID),
  UserID INT NOT NULL FOREIGN KEY
    REFERENCES dbo.Users(UserID),
  PRIMARY KEY(GroupID, UserID)
);

现在,当您要创建新组并向其添加用户时:

DECLARE @GroupID INT;
INSERT dbo.Groups(GroupName) SELECT N'whatever (unique)';
SELECT @GroupID = SCOPE_IDENTITY();

现在,您可以遍历每个用户ID:

INSERT dbo.GroupUsers(GroupID, UserID) SELECT @GroupID, <userid>;
© www.soinside.com 2019 - 2024. All rights reserved.