2017-03-17 22 views
1

ice_creamというテーブルがあり、テーブルがusersflavorsfavoritesの3つのテーブルがあります。 favoritesの各レコードには、ユーザーとフレーバーへの参照があり、ユーザーは複数のアイスクリームフレーバーを持つことができます。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  |     | 
| 201 | 100  | 3   | 5  | Changed my life | 
| 203 | 100  | 18  | 4  |     | 
| 204 | 100  | 24  | 4  |     | 

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

から変更する必要がありますか考慮すべき

ポイント:

  • 私は一貫性のある主の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) 
関連する問題