2014-07-06 227 views
0

我有一個典型的多對多關係,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個插入更新語句,並且可能還需要光標。我有一種感覺,我可能已經完成了複雜的事情,並且真的很想在這裏找到一些幫助。

非常感謝!

回答

0

如果有人遇到相同的問題,我的解決方案是使url成爲產品表中的主鍵(不確定它是否是一個好主意)。因此,在我開始所有的插入操作之前,我知道我手中的所有鑰匙。然後我發出兩個插入更新(注意這一步可以在一個sql語句中完成):

INSERT INTO product('http://productlink.com','testproduct','http://imag.com' ,10)ON DUPLICATE KEY UPDATE url = VALUES(url),image = VALUES(image),current_price = VALUES(current_price);

INSERT INTO user_product(USER_ID,product_url,up_threshold,down_threshold)VALUES( '1', 'http://productlink.com',8)ON DUPLICATE密鑰更新my_price = VALUES(my_price)

記得設置USER_ID和URL作爲複合爲了使映射表的主鍵爲 'ON DUPLICATE密鑰更新'

ALTER TABLE user_product ADD PRIMARY KEY(user_device_id,product_url)

乾杯