2010-09-10 86 views
2

好吧,無論出於何種原因,我最終會遇到這樣一種情況:密鑰在一對多中指向錯誤的方向。它顯然從來沒有被用作一對多的,只是作爲一對一的,現在有必要將其中的一個擴展成很多,並且鑰匙存儲的方式原來是向後的。SQL中交換一對多關係方向的最佳方法是什麼?

images表具有target_id,target_typetarget_column三條信息,它們用任意數量的內容表標識它。 target_type只引用與圖像關聯的內容片段的表名稱。 target_column是用於查找圖像的虛擬列的名稱(實際不在內容表中)。這使得任何一段內容都可以有幾個相關的圖像,每個圖像都有不同的名稱。

當你有一塊內容,並希望找到什麼樣的形象被關聯到一個特定的名字,你做一個

select * from images where target_id = content.id 
    and target_type = "content" 
    and target_column = "image"; 

所有這些信息是可用的,當你有一個特定的引用一塊內容。

我想要做的就是反轉所有這些,這樣圖像表就不會對引用它的特定內容片斷一無所知,而是每個內容表格都承載着這些負擔。

到目前爲止,我知道我可以一列添加到內容表,然後選擇我從圖像表所需的信息:

select id, target_id from images where target_type = "content"; 

我想要做的就是用這個作爲一個子查詢,並做了內容表的大量更新。是這樣的可能嗎?

update content set image_id = 
    (select id from images where target_type = "content") as image_ids where id = 
    (select target_id from images where target_type = "content") as content_ids; 

我知道這會失敗,但我想做一些target_ids的質量分配返回到image_ids。這是瘋了嗎?我該怎麼做呢?

回答

2

你可能想使用MySQL多表更新機制。 (CF http://dev.mysql.com/doc/refman/5.0/en/update.html

你的情況

,這將是

update 
    content, 
    images 
set 
    content.image_id = images.id 
where 
    images.target_id = content.id 
    and images.target_type = 'content' 
    and images.target_column = 'images' 

我希望這將有助於你

傑羅姆·瓦格納

1

你可以加入在圖像表做了更新:​​

update content inner join images on images.target_id = content.id and 
    images.target_type = 'content' and images.target_column = 'images' 
set content.image_id = images.id 
相關問題