为多行SQL创建唯一ID
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为多行SQL创建唯一ID相关的知识,希望对你有一定的参考价值。
我有很多用户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(?,?);
你在说什么是很多关系。您已有用户表:
**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'的答案)
为了使这个更干净,您可能希望稍微重构数据库设置,以便第三个表将用户与组相关联:
users (user_id pk, ...)
groups (group_id pk, ...)
membership (user_id fk, group_id fk) unique(user_id, group_id)
当您需要创建一个新组时,只需插入groups
表,获取group_id
,然后使用该表填充该组中每个用户的membership
表。
您可以使用select作为插入的输入
INSERT INTO group (group_id, user_id)
SELECT 1, user_id FROM users WHERE username in ("name1", name2")
您可以使用逗号将names数组连接起来。
您将需要迭代user_ids列表并为每个用户ID执行单独的insert语句。
您可以使用sub-select和union语句将一个表中的所有用户ID插入另一个表中,如下所示:
INSERT INTO group_table_name([user_id]) SELECT [user_id] FROM table_name
UNION ALL
顺便说一句,您可能希望更改该表名,因为“group”是SQL Server中的关键字。只是一个提示。
插入GroupTable(GroupId,UserID)按GroupID,UserID从UserTable组中选择GroupID,USerID)
这会工作:)
假设您已经知道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>;
以上是关于为多行SQL创建唯一ID的主要内容,如果未能解决你的问题,请参考以下文章