为多行SQL创建唯一ID

时间:2012-03-08 16:13:47

标签: c# sql sql-server database database-design

我有很多用户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(?,?);

7 个答案:

答案 0 :(得分: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'的答案)

答案 1 :(得分:2)

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

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

Visualization of User-Group-Membership relations

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

答案 2 :(得分:0)

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

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

您可以将名字数组与逗号一起加入。

答案 3 :(得分:0)

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

答案 4 :(得分: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>;

答案 5 :(得分:0)

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

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

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

答案 6 :(得分:0)

  

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

这样可行:)