Создать уникальный идентификатор для нескольких строк SQL - PullRequest
1 голос
/ 08 марта 2012

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

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

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 в списке будут иметь одинаковый идентификатор группы.Как я могу это сделать?

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

Ответы [ 7 ]

4 голосов
/ 08 марта 2012

То, о чем вы говорите, это отношения «многие многие». У вас уже есть таблица пользователей:

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

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

select groupid from group where groupname="Sample Group"

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

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

2 голосов
/ 08 марта 2012

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

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 голосов
/ 08 марта 2012

Вставить в GroupTable (GroupId, UserID) Выберите GroupID, USerID из группы UserTable по GroupID, UserID)

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

0 голосов
/ 08 марта 2012

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

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

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

0 голосов
/ 08 марта 2012

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

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

Если вы еще не знаете идентификатор группы, пожалуйста, объясните, как вы определили, что идентификатор группы должен быть равен 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();

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

INSERT dbo.GroupUsers(GroupID, UserID) SELECT @GroupID, <userid>;
0 голосов
/ 08 марта 2012

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

0 голосов
/ 08 марта 2012

Вы можете использовать select как вход для вставки

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

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

...