2012-04-08 60 views
0

我對如何最好地更新連接表有點困惑。PHP MySQL:更新聯接表?

Presentaion 
id PK 

Asset 
id PK 

PresentationAsset 
presentationid 
assetid 

所以更新介紹和它的內PresentationAsset相關資產的時候,我首先搜索所有關係,刪除那些再創造新的?

這種場景的最佳方法是什麼?

回答

1

肯定是最簡單,至少要刪除它們並創建新的。畢竟,這只是兩個查詢。

DELETE FROM PresentationAsset WHERE presentationid = 1 
INSERT INTO PresentationAsset VALUES (1, 1), (1, 2), (1, 3) 

假設這些正是該表中只有兩列(沒有時間戳或任何東西,例如),我無法想象你需要它比任何更復雜的任何理由。

畢竟,擦除現有行並插入所有新行的替代方法是保留已存在的行,但刪除已不存在的行並插入新的行。從本質上講,你至少還有一個DELETE和一個INSERT,所以在大多數現實世界的應用程序中不應該有太多的性能差異。在第一種方法中性能可能會更好,因爲它需要每個操作的較少的值檢查。

當然,如果您正在處理一個足夠大的場景,這樣一個很小的性能差異就很重要,那麼您可能會想要對所有選項進行真實測試並自行測量性能。

和當然,如果這些你的表格中只有兩列,您需要妥善保管其他列的值要更新的行,因此刪除所有和插入新無論如何不會是一個選擇。

+0

是的,這幾乎是我的想法。尋找現有數據,匹配那些沒有變化的數據等等,將會帶來太多的痛苦。謝謝回覆。 – dcolumbus 2012-04-08 18:40:33

0

你有2種選擇:

1)刪除所有資產和如你所說創建新的(DEF更容易編碼,更容易調試。如果你沒有在PresentationAsset一個PK,只問題您可能是那幾個缺失可能使大量數據的PresentationAsset PK。)

2)這樣做(在僞代碼)

  • 得到所有從資產IDS目前與呈現相關聯(舊值)。我將把這個作爲陣列1
  • 對於每個資產在新的價值觀:
    • ,如果它已經存在,其新值更新,並在array1刪除其ID
    • ,如果它不是,創建
  • 刪除所有其PresentationId = IN陣列1 currentPresentationId和由assetid

希望這是很清楚的,希望我理解正確的問題PresentationAsset;)我想我能活機智h 1),但2)可能更好。您更新需要更新的值並刪除已刪除的值。