2010-08-05 8 views
0

Disons dans mon code que j'ai le nom de l'utilisateur, et une valeur. Maintenant, je dois enregistrer cela dans la base de données, mais je dois d'abord obtenir l'ID correspondant à ce nom d'utilisateurs, car cette table lie avec un pk/fk à la table des utilisateurs. Comment fait-on ça? Je sais que vous pouvez faire un INSERT (blah) SELECT etc pour le faire, mais cela ressemble à une copie droite, j'ai besoin d'insérer la valeur avec la colonne fk comme le résultat d'un SELECT.SQL INSERT de SELECT

Tableau de l'utilisateur: [UserID (pk), UserName]

Table Avatar: [UserID (fk), AvatarURL]

Je dois INSERT INTO AvatarTable(UserID, AvatarURL) VALUES (*id of user where UserName = 'theirname'*, 'http://www.blah.com')

Merci

+0

pouvons-nous avoir quelques exemples de données et d'informations structure de données? – mauris

Répondre

5

Vous êtes peut-être à la recherche de ça?:

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

Brillant, merci: D – Matt

+0

ne pas oublier de marquer la réponse comme correcte ... – LesterDove

+0

Oui, attendait les 10 minutes ou plus pour passer avant qu'il me laisse. – Matt

0

Il n'est pas nécessaire d'être une copie rectiligne. Faites simplement correspondre le résultat de l'instruction select à la colonne de votre table cible.

par exemple.

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

En supposant que vos tables sont structurées quelque chose comme:

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) 

Ce que vous voulez est la possibilité d'insérer une entrée dans other_table donné que la valeur et le nom d'utilisateur.

Il est important que vous le fassiez de manière atomique pour vous assurer que le mappage user_id/user_name n'est pas modifié en dessous de vous. En d'autres termes, vous ne pouvez pas faire:

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

depuis le user_id ou user_name peut changer entre ces deux étapes ci-dessus (le user_id probablement ne changerait pas pour la ligne physique, mais il est certainement possible que le tableau pourrait changement de:

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

à:

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

donc, pour le faire atomiquement, il doit être dans une seule instruction SQL (ou une partie d'une transaction, mais vous pouvez éviter une transaction dans ce cas):

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

Pour votre cas particulier (ajouté après ma première réponse), vous cherchez à:

insert into AvatarTable (UserID,AvatarURL) 
    select UserID, :localAvatarURL 
    from UserTable 
    where UserName = :localUserName;