2011-04-21 80 views
2

我目前正在實施項目的CRUD。我有很多many-to-many的關係。其中一些是table1_id,table2_id,其中一些有額外的列(價格,金額等)。許多到很多crud

什麼是更新many-to-many表的最佳方式:如您所見,可能有一些信息已經與新數據一起。

Example

t1_id t2_id amount 
1  3  15 
2  4  50 

我想更新此信息,併發送一些數據,如:{1,3,15}{2,5, 25}。所以我需要更新第一行並插入一個新行。 我想創建一個函數(pl/sql),它將獲取記錄表並檢查它是否是新記錄或更新記錄。

Question:有沒有更好的方法來實現這個?有沒有什麼模式可以實現這個目標?

回答

0

我幾乎總是這樣懶惰地執行,只是從交叉引用表中刪除所有關聯的行,然後運行一條insert語句將其鏈接回去。理想情況下,這將在交易中完成。在分析性能方面我沒有做太多的工作,但是這樣做可能不會太糟糕,特別是如果您有大量更新需要完成的話。

+0

我已經做過一次,但我認爲這是不利於性能的原因。我會添加額外的插入數量,這比在索引列上選擇查詢要慢。不是嗎? – Fluffy 2011-04-21 18:02:21

+0

這通常不是一個問題,除非你有昂貴的檢查約束。這並不是說這是最好的方法。 – tster 2011-04-21 18:08:50

2

您要查找的模式通常稱爲「UPSERT」:插入一行(如果不存在),否則請更新現有行。您仍然需要遍歷行,但是您可以爲每行執行一條語句。

我不知道關於PL/SQL,但這個問題可能會有所幫助:Oracle: how to UPSERT (update or insert into a table?)

+0

Oracle直接支持MERGE語句的upsert。您將不得不將雙精度的select:v1,:v2,v3作爲合併到表中的行。 – 2011-04-24 01:10:16