1

公平を期すために、ここここでいくつかの同様の質問を見てきましたが、これらの質問は主に単一行の更新について尋ねているだけでなく、実際のデータが変更されないと仮定していると思います。

私の場合、販売担当者が提供できる一連の製品があります。これらの全体的な製品は、それらを定義するマスター テーブルによって維持されます。

マスターテーブル

ID  | Name  | status
---------------------
1   | prod1 |  1
2   | prod2 |  1
3   | prod3 |  0
4   | prod4 |  1

status は、アクティブ (1) または非アクティブ (0) を表します。非アクティブな製品は、担当者テーブルの設定に関係なく、担当者が販売することはできません。

rep_table

ID |  repID  |  status
------------------------
1  |   rep1  |   1
2  |   rep1  |   1
3  |   rep1  |   1
1  |   rep2  |   0
2  |   rep2  |   1
3  |   rep3  |   0

このテーブルのステータスは、アクティブ (1) または非アクティブ (0) です。ここでも、マスター テーブルのステータスは、営業担当者が提供できる製品を決定するという点で、rep_table ステータスよりも常に優先されます。

私が直面している主な問題は、担当者が販売する新製品を導入するときです。担当者の管理ポータルで、担当者は、提供したい製品のセットをアクティブ化または非アクティブ化できます。ユーザーが販売したいすべての製品を (フォームのチェックボックスで) 選択し、送信をクリックすると、一連のチェックが開始されます。

  1. 担当者は一連の製品を選択しましたか?
  2. 製品は正しいフォーマットで選択されていますか?
  3. 選択した製品のリストは、ログイン時にすでに設定されていたものと異なりますか (そうでない場合は、更新が行われないことを警告します)?
  4. フォームで選択されたすべての製品が存在し、master_table で「アクティブ」に設定されていますか?

その時点で、ロジックは (現在) 選択された製品ごとに次のように切り替わります。

  1. rep_table 内のすべての製品を非アクティブに更新します (その特定の担当者に対して)
  2. ログイン時に製品が現在の製品セットに存在し、現在のステータスが非アクティブに設定されている場合は、その製品 ID をアクティブのキューに入れます。
  3. 渡された製品がログイン時に現在の製品セットに存在しなかった場合は、新しい製品を rep_table に挿入し、アクティブに設定します。

「更新」ステートメントの開始時に特定の担当者のすべての製品を非アクティブに更新する主な理由は、ログイン時に「アクティブ」に設定されていた製品が「非アクティブ」に変更されたことを発見するという複雑な性質によるものでした。商品選択フォーム。

担当者がログインしたときの現在の製品選択のステータスと比較して、現在の製品選択のステータスを把握しようとする代わりに、最初に rep_table の特定の担当者 ID のすべての製品 ID を削除してから、すべてを挿入する方が簡単ではないかどうか疑問に思っています。一度。この場合、2 つのクエリを実行していることはわかっていますが、同じコマンドで更新と挿入を行うシナリオでは、毎回少なくとも 2 つ以上のクエリを実行しています。

この方法での削除と挿入に「技術的な」影響はありますか?

注: 私のテーブルは InnoDB で、MySQL を実行しています

4

3 に答える 3

0

概念的な観点から、他の回答を完了するために、UPDATE既存の行を変更します。DELETE+INSERT新しい行を作成します。

最初はかなり理論的ですが、これには実際的な意味があります。

  • たとえば、データベースの参照整合性について (外部キー制約、カスケード)。
  • これにより、さまざまなトリガーも起動される可能性があります。
  • 最後にDELETE+は、同じ行のINSERT同時実行と競合する可能性があります (おそらく競合するでしょう) 。UPDATES
于 2013-07-31T22:25:29.413 に答える