2010-08-05 64 views
0

讓我說在我的代碼中我有用戶名和值。現在我需要將它保存在數據庫中,但我需要首先獲取與該用戶名相對應的ID,因爲此表與用戶表的pk/fk鏈接。我該怎麼做? 我知道你可以做一個INSERT(blah)SELECT等來做這件事,但看起來像一個直接的副本,我需要插入值爲fk列作爲SELECT的結果。來自SELECT的SQL INSERT

用戶表: [用戶ID(PK),用戶名]

頭像表: [用戶ID(FK),AvatarURL]

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

由於

+0

我們可以有一些樣本數據和數據結構的信息? – mauris 2010-08-05 02:31:15

回答

5

您或許正在尋找?:

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

輝煌,感謝:D – Matt 2010-08-05 02:43:47

+0

不要忘記標記答案是正確的... – LesterDove 2010-08-05 02:59:02

+0

是的,正等待10分鐘左右才能通過它讓我。 – Matt 2010-08-05 03:10:30

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;