1

次の列を持つ2つのテーブルがあります。

SUMMARY(sum_id, sum_number) and DETAILS(det_id, det_number, sum_id)

IDのリストにdet_idが含まれるテーブルから行を削除したいのですDETAILSが、これは次の方法で実行できます。

DELETE FROM details WHERE det_id in (1,2,3...)

しかし

  1. 同時に、次のSUMMARY場合はテーブルを更新する必要がありますsummary.sum_id=details.sum_id

    UPDATE summary SET sum_number-=somefunction(details.det_number) 
    WHERE summary.sum_id=details.sum_id
    
  2. さらに、後でSUMMARYテーブルから行を削除するのは完全に素晴らしいことです。sum_number<=0

これらすべてをインテリジェントな方法で行うにはどうすればよいですか?

最初から両方のIDを知っている場合はどうなりますか:(details.det_id削除する)ANDsummary.sum_idに対応するdetails.det_id

4

3 に答える 3

2

あなたはDBMSを指定しなかったので、私はPostgreSQLを想定しています。

これは、新しい書き込み可能なCTE機能を使用して1つのステートメントで実行できます。

with deleted as (
   delete from details
   where det_id in (1,2,3...)
   returning details.*
),
new_summary as (
   update summary 
      set sum_number = some_function(deleted.det_number)
   from deleted
   where delete.sum_id = summary.sum_id
   returning summary.sum_id
) 
delete from summary 
where sum_number <= 0
and sum_id in (select sum_id from new_summary);

外部削除のin条件は厳密には必要ありませんが、使用しないCTE定義がない可能性があるため、条件により、new_summaryCTEがステートメントで実際に使用されることが保証されます。さらに、変更された要約行のみがチェックされるため(すべてではない)、パフォーマンスが少し向上する可能性があります。

于 2012-09-18T12:21:56.560 に答える
0

これらすべての操作を1つのステートメントで実行することはできません。あなたはこのようなことをしなければならないでしょう:

UPDATE summary SET sum_number = somefunction(details.det_number)
FROM summary INNER JOIN details ON summary.sum_id = details.sum_id

DELETE FROM details WHERE det_id IN (1,2,3,...)

DELETE FROM summary WHERE sum_number <= 0
于 2012-09-18T10:48:48.877 に答える
0

トリガーを使用します...その後、データベースが削除を担当します。

更新トリガーを使用して、更新が成功した場合、必要なだけ実行できるトリガーを起動します...つまり、2回の削除を実行できます。

例として、このチュートリアルを読んでください。

http://www.mysqltutorial.org/create-the-first-trigger-in-mysql.aspxこの回答(http://stackoverflow.com/questions/6296313/mysql-trigger-after-update-only-if- stackoverflowのrow-has-changed)も良い例です。

于 2012-09-18T10:55:55.363 に答える