[英]Insert multiple many to many relationship
我有一個典型的多對多關系,涉及 3 個表:
user (id, name)
product (id, name, current_price, image, url)
user_product_mapping (user_id, product_id, my_purchase_price)
。 請注意,映射表有一個額外的列my_purchase_price
,因為用戶可以指定他自己的價格。
我正在構建一個允許批量插入的 API,例如
curl -d '{"products": [\
{"image":"http://example.com/images/testproduct", "name":"testproduct", "url":"http://example.com/products/test", "current_price":50, "my_purchase_price":40},\
{"image":"http://example.com/images/testproduct2","name":"testproduct2","url":"http://example.com/products/test2","current_price":100,"my_purchase_price":80} \
]}' \
-X POST http://example.com/users/1/products -H "Content-Type: application/json"
本例中,用戶ID為1,有2個商品要插入,價格分別為50、100,用戶指定的價格分別為40、80。
我的問題是:如何有效地將數據插入 3 個表中(如果不存在則創建一個用戶條目)? 我不想按 1 插入 1。希望我可以將它們插入到 sproc 中。
問題是我不想在product
、 user
和product_user_mapping
表中重復。 因此,如果產品表中已經有這樣的產品(URL 是唯一鍵),那么我只會更新它們的價格。 如果product_user_mapping
表中已經有映射,那么只會更新 my_purchase_price。 如果不存在,我基本上需要 2 次插入並更新重復項,但是第二次插入更新需要知道第一次插入更新的 ID,我找不到在第二次插入/更新期間更新my_purchase_price
的有效方法。 更有趣的是,API 實際上還允許用戶指定用戶名,這意味着如果用戶 1 不存在於用戶表中,我也會在用戶表中為用戶 1 創建一個條目。
我故意不使用 URL 作為產品表中的主鍵,因為我認為使用 URL 作為主鍵通常是一個壞主意(是嗎?)。 我嘗試了幾種方法,但沒有一個讓我滿意:
方法一:
INSERT INTO product ON DUPLICATE KEY (url) UPDATE price, image
INSERT INTO user_product_mapping ON DUPLICATE KEY UPDATE my_purchase_price
。方法二:
INSERT INTO product ON DUPLICATE KEY (url) UPDATE price, image;
DELETE FROM user_product_mapping
WHERE user_id=1
AND product_id NOT IN (
SELECT product id
FROM product
WHERE url NOT IN (the urls passed from api)
);
INSERT INTO user_product_mapping;
我似乎至少寫了 3 條插入更新語句,可能還需要一個游標。 我有一種感覺,我可能會處理復雜的事情。
如果有人遇到同樣的問題,我的解決方案是將 URL 設為產品表中的主鍵(不確定這是否是個好主意)。 因此,在我開始所有插入操作之前,我事先知道所有的鍵。 然后我發出兩個 insert-update-on-duplicate 查詢(注意這一步可以在一個 SQL 語句中完成):
INSERT INTO product (url, name, image, current_price)
VALUES
('http://example.com/product/test', 'testproduct', 'http://example.com/images/testproduct', 10)
ON DUPLICATE KEY UPDATE
url=VALUES(url),
image=VALUES(image),
current_price=VALUES(current_price);
INSERT INTO user_product (user_id, product_url, my_purchase_price)
VALUES
(1, 'http://example.com/products/test', 8)
ON DUPLICATE KEY UPDATE
my_price=VALUES(my_price);
請記住將user_id
和url
設置為映射表的復合主鍵,以便應用ON DUPLICATE KEY UPDATE
子句
ALTER TABLE user_product ADD PRIMARY KEY (user_device_id, product_url);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.