我有一個典型的多對多關係,3個表,用戶(id,name),產品(id,name,current_price,image,url),user_product_mapping(user_id,product_id,my_purchase_price )。請注意,映射表有一個額外的列my_purchase_price,因爲用戶可以指定他自己的價格。插入多對多關係
我正在構建一個允許批量插入的Api,例如,
捲曲-d「{ 「產品」:[{ 「圖像」: 「http://imageurl.com」, 「名稱」: 「testproduct」, 「URL」: 「http://productlink.com」, 「CURRENT_PRICE」:50, 「my_purchase_price」:40 },{「image」:「http://imageurl2.com」,「name」:「testproduct2」,「url」:「http://productlink2.com」,「current_price」:100,「my_purchase_price」:80}]}'-X POST http://mydomain.com/users/1/products -H「Content 「type:application/json」
在這種情況下,用戶標識爲1,並且有2個產品要插入,其價格分別爲50,100和用戶指定的價格分別爲40,80。
我的問題是,我如何有效地將這些信息插入到3個表(創建用戶條目,如果不存在)?我不想插入1 1.希望我可以插入他們只是在一個存儲過程。
問題是我不希望產品,用戶和product_user_mapping表中存在重複項。所以如果產品表中已經有這樣的產品(url爲唯一關鍵字),那麼我只會更新他們的價格。如果在product_user_mapping表中已經有映射,那麼只有my_purchase_price會被更新。我基本上需要2個插入(如果不存在並更新重複項),但第二個插入更新需要知道第一個插入更新的ID,並且我找不到在第二次插入/更新期間更新my_purchase_price的有效方法。爲了讓事情更有趣,api實際上允許用戶指定用戶的名字,也就是說,如果用戶1不存在於用戶表中,我將在用戶表中爲用戶1創建一個條目。
我故意不使用url作爲產品表中的主鍵,因爲我認爲url作爲主鍵通常是一個糟糕的主意(是嗎?)我嘗試了幾種方法,但都沒有讓我滿意:
方法1: +在重複鍵(url)上插入PRODUCT更新價格,圖片 +獲取之前插入/更新的產品ID的所有ID。 +在重複鍵更新(my_purchase_price)上插入USER_PRODUCT_MAPPING。
方法2: +插入PRODUCT上重複鍵(URL)更新價格,圖像 +從user_product_mapping刪除其中USER_ID = 1和PRODUCT_ID未在(選擇從產品的產品id其中URL不在(網址從傳遞api) + insert into user_product_mapping
我似乎寫了至少3個插入更新語句,並且可能還需要光標。我有一種感覺,我可能已經完成了複雜的事情,並且真的很想在這裏找到一些幫助。
非常感謝!