2017-03-17 43 views
1

我有一個名爲ice_cream的MySQL數據庫,其中有三個表,users,flavorsfavoritesfavorites中的每條記錄都有對用戶和風味的引用,並且用戶能夠擁有多種冰淇淋風味。替換MySQL記錄的子集

我想寫一個事務來完全替換另一組收藏夾中的用戶的收藏夾。例如,當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
在這種情況下

最有效的一組語句刪除和插入

delete from flavors 
where user_id =100; 

和循環服務器端的插入與所有值的新值或批量插入在repated值的行

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)