none
複数テーブル内の同一条件レコードを一括削除するには? RRS feed

  • 質問

  • よろしくお願いします。

     

    複数のテーブルの同一条件レコードを一括で削除したい場合

    どのように記述すれば宜しいのでしょうか?

     

    Table_AからTable_Pまでのテーブルには

    それぞれフィールドField_1とField_2が必ず有ります。

     

    テーブルTable_AからTable_Pで以下の条件の

    WHERE Field_1 = 'A' AND Field_2 = 'B'

     

    レコードは全て削除させたいのです。

     

    どなたか御指導下さいますよう、よろしくお願いいたします。

    2008年11月28日 7:36

回答

  • 普通にトランザクションを切って、Table_AからTable_PまでをそれぞれをDelete文で削除すれば良いと思うのですが、何か前提条件などあるのでしょうか? 質問の内容から言って簡単に削除する方法を尋ねられているようにも取れるのですが、そのような方法は無いでしょう。

    2008年11月28日 9:33
  •  エリック さんからの引用

    よろしくお願いします。

     

    複数のテーブルの同一条件レコードを一括で削除したい場合

    どのように記述すれば宜しいのでしょうか?

     

    Table_AからTable_Pまでのテーブルには

    それぞれフィールドField_1とField_2が必ず有ります。

     

    テーブルTable_AからTable_Pで以下の条件の

    WHERE Field_1 = 'A' AND Field_2 = 'B'

     

    レコードは全て削除させたいのです。

     

    どなたか御指導下さいますよう、よろしくお願いいたします。

     

    連鎖参照整合性制約の事かな?

    http://msdn.microsoft.com/ja-jp/library/aa933119.aspx

     

     前提条件として、外部キーが設定されている事とCREATE TABLE(もしくはALTER TABLE)でREFERENCES句に"ON DELETE"、"ON UPDATE"が設定されている必要があります。

    (詳細については上記のMSDNライブラリ、もしくはSQL ServerのBooks Onlineを参照してください)

     

     イメージとしては、マスターデータを削除したら、それに関連するデータも同時に削除されると考えれば良いかと思います。

     

     今回の例であれば、Table_AからTable_Pまでのテーブル(どれが主になるテーブルなんだろ?)にALTER TABLEで外部キーを設定して、同時にREFERENCES句に"ON DELETE CASCADE"を追加すれば実現できると思います。

     

    2008年11月28日 10:39
  • 複数テーブルを対象にDeleteを書くのが面倒ということですよね?

     

    このようなニーズは、複数テーブルがそれぞれ年月ごとに、いろいろな情報を管理していて、

    あるタイミングで年月をキーに一括削除したいという場合にあると思います。

     

    残念ながらそのような構文はなく、一つずつDeleteを記述する必要があります。

    2008年11月29日 6:18
  •  何回か同じような処理をしなくてはいけないのであれば、ストアドプロシージャ化してみるとかはどうでしょうか?

     削除するパラーメータを渡して、関連するテーブルからデータを削除するとか。

     

     後、Table_AからTable_Pというテーブルの名前に連続性(Table_A、Table_B、…、Table_P)なら、ストアドプロシージャ内でクエリーを組み立ててDELETEするのも一つの手でだと思います。

     

     これがマスターデータに対するトランザクションデータでしたら、前回書いたようにREFERENCESにON DELETEを記述する事で、関連するレコードは削除されますけど。(外部キーが設定されている必要がありますが)

     

    2008年11月29日 12:18

すべての返信

  • 普通にトランザクションを切って、Table_AからTable_PまでをそれぞれをDelete文で削除すれば良いと思うのですが、何か前提条件などあるのでしょうか? 質問の内容から言って簡単に削除する方法を尋ねられているようにも取れるのですが、そのような方法は無いでしょう。

    2008年11月28日 9:33
  •  エリック さんからの引用

    よろしくお願いします。

     

    複数のテーブルの同一条件レコードを一括で削除したい場合

    どのように記述すれば宜しいのでしょうか?

     

    Table_AからTable_Pまでのテーブルには

    それぞれフィールドField_1とField_2が必ず有ります。

     

    テーブルTable_AからTable_Pで以下の条件の

    WHERE Field_1 = 'A' AND Field_2 = 'B'

     

    レコードは全て削除させたいのです。

     

    どなたか御指導下さいますよう、よろしくお願いいたします。

     

    連鎖参照整合性制約の事かな?

    http://msdn.microsoft.com/ja-jp/library/aa933119.aspx

     

     前提条件として、外部キーが設定されている事とCREATE TABLE(もしくはALTER TABLE)でREFERENCES句に"ON DELETE"、"ON UPDATE"が設定されている必要があります。

    (詳細については上記のMSDNライブラリ、もしくはSQL ServerのBooks Onlineを参照してください)

     

     イメージとしては、マスターデータを削除したら、それに関連するデータも同時に削除されると考えれば良いかと思います。

     

     今回の例であれば、Table_AからTable_Pまでのテーブル(どれが主になるテーブルなんだろ?)にALTER TABLEで外部キーを設定して、同時にREFERENCES句に"ON DELETE CASCADE"を追加すれば実現できると思います。

     

    2008年11月28日 10:39
  • 複数テーブルを対象にDeleteを書くのが面倒ということですよね?

     

    このようなニーズは、複数テーブルがそれぞれ年月ごとに、いろいろな情報を管理していて、

    あるタイミングで年月をキーに一括削除したいという場合にあると思います。

     

    残念ながらそのような構文はなく、一つずつDeleteを記述する必要があります。

    2008年11月29日 6:18
  •  何回か同じような処理をしなくてはいけないのであれば、ストアドプロシージャ化してみるとかはどうでしょうか?

     削除するパラーメータを渡して、関連するテーブルからデータを削除するとか。

     

     後、Table_AからTable_Pというテーブルの名前に連続性(Table_A、Table_B、…、Table_P)なら、ストアドプロシージャ内でクエリーを組み立ててDELETEするのも一つの手でだと思います。

     

     これがマスターデータに対するトランザクションデータでしたら、前回書いたようにREFERENCESにON DELETEを記述する事で、関連するレコードは削除されますけど。(外部キーが設定されている必要がありますが)

     

    2008年11月29日 12:18
  • こんにちは。フォーラムオペレータ大久保です。

     

    エリック さん、フォーラムのご利用ありがとうございます。

    みなさんから、いろいろな方面からのアドバイスをいただきましたが、エリック さんのご要望にお応えできる情報はありましたでしょうか?

    汎用性やデータの整合性の保証など、前提がおありのことと思いますので、それにあわせて方法を選択していただければと。

     

    アドバイスくださった皆様の投稿に「回答済み」チェックをつけさせていただきましたが、これらのアイディアの採用が難しい場合、その理由や環境の詳細など教えてください。

    また別の角度からのアドバイスがいただけると思います

     

    それではー

    2008年12月4日 2:35