我有一个典型的多对多关系,3个表,用户(id,名称),产品(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://imageurl.com”,“name”:“testproduct”,“url”:“http://productlink.com”,“current_price”: 50, “my_purchase_price”:40},{ “图像”: “http://imageurl2.com”, “名称”: “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“
在这种情况下,用户ID为1,并且有2个产品要插入,其价格分别为50,100和用户指定的价格分别为40,80。
我的问题是,如何有效地将这些信息插入3个表中(如果不存在则创建用户条目)?我不想插入1.希望我可以将它们插入一个sproc中。
问题是我不想在product,user和product_user_mapping表中重复。因此,如果产品表中已经有这样的产品(url作为唯一密钥),那么我将只更新它们的价格。如果product_user_mapping表中已有映射,那么只会更新my_purchase_price。如果不存在则基本上需要2次插入并在重复项上更新,但是第二次插入更新需要知道第一次插入更新的ID,我找不到在第二次插入/更新期间更新my_purchase_price的有效方法。为了使事情变得更有趣,api实际上允许用户指定用户名,这意味着,如果用户1中不存在用户1,我将在用户表中创建用户1的条目。
我故意不使用url作为产品表中的主键,因为我认为url作为主键通常是一个坏主意(是吗?)我尝试了几种方法,但没有一种令我满意:< / p>
方法1: +在重复键(url)更新价格,图片上插入PRODUCT +获取以前插入/更新的产品ID的所有ID。 +在重复密钥更新(my_purchase_price)上插入USER_PRODUCT_MAPPING。
方法2: +在重复键(url)更新价格,图片上插入PRODUCT +从user_product_mapping中删除,其中user_id = 1且product_id不在(从产品中选择产品ID,其中url不在(从api传递的URL) +插入user_product_mapping
我似乎已经编写了至少3个插入更新语句,并且可能还需要游标。我有一种感觉,我可能会有一些复杂的东西,并且真的希望在这里提供一些帮助。
提前多多谢谢!
答案 0 :(得分:0)
如果有人遇到同样的问题,我的解决方案是将url作为产品表中的主键(不确定它是否是个好主意)。因此,在我开始所有插入操作之前,我知道我手头的所有键。然后我在重复时发出两次插入更新(注意这一步可以在一个sql语句中完成):
INSERT INTO product(url,name,image,current_price)VALUES('http://productlink.com','testproduct','http://imag.com',10)ON DUPLICATE KEY UPDATE url = VALUES(url), image = VALUES(图片),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 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)
干杯