質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Q&A

解決済

3回答

1080閲覧

1:nの関係にあるテーブルを削除する処理のセオリーが知りたい

flaumig

総合スコア67

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

0グッド

0クリップ

投稿2020/05/15 02:56

質問内容

下記のように1:nの関係にあるテーブルが複数の階層を作っていたとします。
ここでparent_id=1に関連するデータを全て削除したい場合、
処理の流れとしてはどちらが一般的なのでしょうか?

  1. 上の階層から順に削除する(親→子→孫)
  2. 下の階層から順に削除すう(孫→子→親)

前提として

  • 1テーブルずつ削除処理を行います
  • 各テーブルに対して、レコードの存在チェック→削除の順に処理を行います

 (メモリ上に子レコードを引くための親レコード情報は保持されている)

  • 削除処理自体を1つのトランザクションとして処理します

 (途中でエラーが起きた場合は全てのテーブルがロールバックされる)

今まで何となく一番下のテーブルから削除していたのですが、
よくよく考えたらトランザクション制御をしているので
どっちから消しても同じなのでは?と困り、こちらに質問させていただきました。

「こうする方が〇〇の面から一般的」や「こちらのやり方には△△というメリット(デメリット)がある」など
ありましたら、ご教示いただけますと幸いです。

テーブル構造の例

・親テーブル

parent_idname
1aaa
2bbb

・子テーブル

child_idparent_idvalue
11111
21222
32333

・孫テーブル1

grandchild_id1child_idtext
11あいうえお
21かきくけこ
33さしすせそ

・孫テーブル2

grandchild_id2child_idurl
12https://hoge.com
23https://moga.com
33https://fugo.com

補足情報(FW/ツールのバージョンなど)

MySQL 5.6での処理を想定しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

下位階層から削除します。
上位階層から削除すると、関係性が不明となる下位階層が発生してしまいます。

トランザクション制御しているからと言っても、トランザクションモードによっては、トランザクション内でも、下位階層が見れなくなってしまいます。

処理途中のキーは保存されながら行われているとの事ですが、下位階層からであれば、1件毎ではなくSQLのみでテーブルごとの一括処理も可能ですし。

参照整合性により連動して削除する設定が可能であったりしますが、要件変更があった場合を考えると下位階層から削除する仕組みにしておいた方が、対応時の工数は低いでしょう。

投稿2020/05/15 03:04

編集2020/05/15 03:19
sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

flaumig

2020/05/15 03:59

ご回答ありがとうございます。 保守性という観点は無かったのでとても勉強になりました。
guest

0

1テーブルずつ削除処理を行います

FOREIGN KEYON DELETE CASCADEとしておけば、親を消すことで一気に削除されるようになります。使い方によってはそういうのもありです。

投稿2020/05/15 03:25

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

flaumig

2020/05/15 04:11

ご回答ありがとうございます。 foriegn key制約やON DELETE CASCADEを知りませんでしたので勉強になりました。
guest

0

テーブルがわかれているならforiegn key制約で処理するか
triggerで管理すればよいでしょう

投稿2020/05/15 03:13

yambejp

総合スコア114775

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2020/05/15 03:15

効率を考えなければどちらから消し始めてもさほど変わりません 多重に正規化されたデータを削除するということはそれなり特殊な 状況を想定しているのでしょうから、通常の処理と同等の効率を 考える必要はないでしょう
yambejp

2020/05/15 03:30

参考 create table oya(pid int primary key,name varchar(20),delflag int default 0); insert into oya values (1,'aaa',0), (2,'bbb',0); create table ko(cid int primary key,pid int,value int,delflag int default 0, foreign key(pid) references oya(pid) on delete cascade); insert into ko values (1,1,111,0), (2,1,222,0), (3,2,333,0); create table mago(gid int primary key,cid int,txt text,delflag int default 0, foreign key(cid) references ko(cid) on delete cascade); insert into mago values (1,1,'あいうえお',0), (2,1,'かきくけこ',0), (3,3,'さしすせそ',0); 上記oyaのpid=1を消すと、koのcid=1,2が消え、magoのgid=1,2も消えます
flaumig

2020/05/15 04:10

ご回答ありがとうございます。 また、参考DDLもありがとうございます。 テーブル作成時にforiegn key制約を付けると一括削除ができるんですね。勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問