2012-03-08 8 views
1

У меня есть несколько ID пользователя. Я вставляю их в таблицу групп, которая будет содержать столбец для идентификатора пользователя и идентификатора группы. Это позволит мне использовать запрос «SELECT user_id FROM groups WHERE group_id = '3';" для извлечения пользовательских идентификаторов всех членов группы 3.Создайте уникальный идентификатор для нескольких строк SQL

Моей проблема заключается в том, что я в настоящее время есть список всех идентификаторов пользователей, которые я получил от формы, используя оператор:

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 
} 

я теперь хотите вставить эти данные в таблицу групп, где все значения user_id в списке будут иметь тот же идентификатор group_ID. Как я могу это сделать?

//create a group from users 
"INSERT INTO group (group_id, user_id) VALUES(?,?); 
+0

ли 'group' таблицы структурированы (первым это потенциально опасное имя, вы можете столкнуться с проблемами с ключевыми словами), чтобы у него не было первичного ключа? – user7116

+0

Вам нужно беспокоиться о слиянии списков и избегать дублирования записей? Используете ли вы SQL Server 2008 (допускаете операцию слияния)? –

+0

Да, первичного ключа нет. Я использую SQL Server в комплекте с WebMatrix, я считаю, что его SQL Server Compact Edition? –

ответ

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") 

Тогда вы можете получить идентификатор группы и использовать ее для вставки в user_groups

select groupid from group where groupname="Sample Group" 

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

Кроме того, структура таблицы должна включать в себя первичные ключи и внешние ключи (так же, как ответ @sixlettervariables)

+0

Большое спасибо за этот ответ. Однако я смущен, как это позволит мне использовать код, который у меня выше? Не могли бы вы мне помочь? –

0

Вы можете использовать выбрать в качестве входных данных для вставки

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

Вы можете присоединиться к массив имен вместе с некоторыми запятыми.

0

Вам нужно будет перебирать список user_ids и делать отдельный оператор insert для каждого идентификатора пользователя.

0

Предполагая, что вы уже знаете 3, вы можете сделать это без потянув идентификаторов пользователей в локальном списке, а затем вставлять их по отдельности:

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

Если вы уже не знаете идентификатор группы, то пожалуйста, объясните как вы определили идентификатор группы, должен быть 3.

EDIT на основании дополнительной информации.

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(); 

Теперь вы можете перебрать каждый идентификатор пользователя:

INSERT dbo.GroupUsers(GroupID, UserID) SELECT @GroupID, <userid>; 
+0

3 - это уникальный идентификатор группы для списка пользователей; Я хотел, чтобы это была AUTO_INCREMENTED для каждой группы, если вы понимаете мой смысл. –

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 для каждого из пользователей этой группы.

0

Вы можете вставить все идентификатор пользователя из одной таблицы в другую с помощью суб-выбора и накидной заявление следующим образом:

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

Кстати, вы можете изменить это имя таблицы, так как «группы "- это ключевое слово в SQL Server. Просто подсказка.

0

Вставьте в GroupTable (GroupID, Идентификатор_пользователь) Выберите GroupID, USERID из UserTable группы по GroupID, Идентификатор_пользователь)

Это будет работать :)

Смежные вопросы