簡體   English   中英

插入多個多對多關系

[英]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 中。

問題是我不想在productuserproduct_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
  • 獲取之前插入/更新的產品 ID 的所有 ID。
  • 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_idurl設置為映射表的復合主鍵,以便應用ON DUPLICATE KEY UPDATE子句

ALTER TABLE user_product ADD PRIMARY KEY (user_device_id, product_url);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM