替换MySQL记录的子集

时间:2017-03-17 20:00:45

标签: mysql

我有一个名为ice_cream的MySQL数据库,其中有三个表usersflavorsfavoritesfavorites中的每条记录都有一个用户和一个风味的参考,用户可以有多种冰淇淋口味。

我正在尝试编写一个事务来完全用另一组收藏夹替换用户的收藏夹。例如,当API接受

PUT /user/100/favorites

{ 
  "flavors": {
    "2": { "stars": 2 },
    "3": { "stars": 5, "comments": "Changed my life" },
    "18": { "stars": 4, "comments": " " },
    "24": { "stars": 4 }
  }
}

favorites表应该从

更改
| id  | user_id | flavor_id | stars | comments           |
| --- | ------- | --------- | ----- | ------------------ |
| 200 | 100     | 2         | 2     | Tastes OK          |
| 201 | 100     | 4         | 3     |                    |
| 202 | 100     | 5         | 3     |                    |

| id  | user_id | flavor_id | stars | comments           |
| --- | ------- | --------- | ----- | ------------------ |
| 200 | 100     | 2         | 2     |                    |
| 201 | 100     | 3         | 5     | Changed my life    |
| 203 | 100     | 18        | 4     |                  |
| 204 | 100     | 24        | 4     |                    |

实现这一目标的最有效的陈述是什么?

要考虑的要点:

  • 我并不关心保持主要ID一致。
  • 用户真正进入小批量工艺冰淇淋场景,每次交易通常会取代约5000条记录。

1 个答案:

答案 0 :(得分:1)

在这种情况下,最有效的语句集是删除和插入

delete from flavors
where user_id =100;

和循环服务器端用于插入新值或批量插入,其中包含重复值行中的所有值

insert into flavors ( user_id, flavor_id, stars , comments ) 
values (  100,2 ,2 null), 
      (100, 3, 5 , 'Changed my life'), 
      (100 ,18,4 ,   ),
       (100 , 24 ,4 , null)