2010-08-05 5 views
0

Давайте скажем в моем коде, у меня есть имя пользователя и значение. Теперь мне нужно сохранить это в db, но мне нужно сначала получить идентификатор, соответствующий этому имени пользователя, потому что эта таблица связана с pk/fk с таблицей пользователей. Как мне это сделать? Я знаю, что вы можете сделать INSERT (blah) SELECT и т. Д., Но это похоже на прямую копию, мне нужно вставить значение с столбцом fk в результате из SELECT.SQL INSERT от SELECT

Таблица Пользователь: [Идентификатор_пользователь (рк), UserName]

Аватар Таблица: [Идентификатор_пользователь (Ф.К.), AvatarURL]

Мне нужно INSERT INTO AvatarTable(UserID, AvatarURL) VALUES (*id of user where UserName = 'theirname'*, 'http://www.blah.com')

Спасибо

+0

мы можем иметь некоторые образцы данных и структуры данных информации? – mauris

ответ

5

Возможно, вы ищете:

insert into myDestTable (userid, name, value, othercolumns) 
select us.userid, us.name,'myvaluefromcode', othercolumns 
from users us 
where us.name = 'mynamefromcode' 
+0

Brilliant, спасибо: D – Matt

+0

не забудьте отметить ответ как правильный ... – LesterDove

+0

Да, ждал 10 минут или около того, чтобы пройти, прежде чем он позволил мне. – Matt

0

Не обязательно быть прямой копией. Просто сделайте результат оператора select совпадающим с столбцом целевой таблицы.

например.

insert into NEW_TAB(user_name, order_id) 
select u.user_name, o.order_id 
from ORDER o 
inner join USER u 
    on o.user_id = u.user_id 
0

Предполагая, что ваши таблицы структурированы что-то вроде:

users: 
    user_id   integer 
    user_name   varchar(50) 
    user_other_data varchar(999) 
    primary key  (user_id) 
    unique   (user_name) 
other_table: 
    user_value  varchar(999) 
    user_id   integer foreign key (users.user_id) 

То, что вы хотите, это возможность вставить запись в other_table заданную только значение и имя пользователя.

Важно, чтобы вы сделали это атомным способом, чтобы гарантировать, что сопоставление user_id/user_name не будет изменено под вами. Другими словами, вы не можете сделать:

get user_id from users based on user_name. 
insert value and user_id into other_table. 

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

user_id user_name 
------- --------- 
1  bob 
2  george 

к:

user_id user_name 
------- --------- 
1  george 
2  bob 

таким образом, чтобы сделать его атомарной, он должен быть в одном операторе SQL (или часть сделки, но вы можете избежать сделки в этом случае):

insert into other_table (user_value, user_id) 
    select :value, user_id from users where user_name = :name; 

Для вашего конкретного случая (добавлено после моего первоначального ответа) вы смотрите:

insert into AvatarTable (UserID,AvatarURL) 
    select UserID, :localAvatarURL 
    from UserTable 
    where UserName = :localUserName; 
Смежные вопросы