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

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

新規登録して質問してみよう
ただいま回答率
85.48%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

3回答

1342閲覧

1対多の関係を持つテーブルのデータを削除するループのロジック

tomuziso

総合スコア40

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

1クリップ

投稿2018/07/07 17:56

KotlinとSpring Bootで開発中です。

題名の通り、データ削除のロジックについて質問です。

1:Aテーブル
多:Bテーブル
の関係2つのテーブルがあります。

Bテーブルのレコードが5日以上古い場合は、都度削除するようにしようとしています。
その際、外部キーとして持っているAテーブルのレコードも削除する仕様です。

現在の実装

Bテーブルから5日以上前のレコードをSQLで全部引っ張ってくる。 ↓ 引っ張ってきたレコードの数でループを回す ↓ Bテーブルのidと回しているレコードのidが合致したら削除 ↓ Aテーブルのidと回しているレコードの`a_id`が合致したら削除

という感じで作ってみました。
しかし、よくよく考えるとBテーブルは多ですので、Aを削除する前に紐付いているBのレコードは全部削除してからAを削除しないと外部キー制約で確実にループがコケていしまいます。

こういった場合はどういうロジックで削除していくのがいいのでしょうか?
ループの中にifで分岐させるのも考えたのですが、そもそも古いレコード分ループが回るのでしっくりきませんでした。

どなかた教えて頂ける方、よろしくお願い致します。

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

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

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

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

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

TM3tmlab

2018/07/08 00:23

条件を一つ確認したいです。「AテーブルとBテーブルは必ず1対以上が同時に作成される」かどうか。一対多といっても 1対0...n なのか 1対1...n なのかで変わるので。
tomuziso

2018/07/09 02:08

失礼しました。MySQLという前提でした。また、条件については1対0...nという条件でした。情報に不足があり申し訳ありません。
guest

回答3

0

ベストアンサー

データベースが何か書いてありませんが、ON DELETE CASCADE付きで外部キーを設定してあれば親テーブルの5日以上経過したデータをDELETEするSQLを1行実行するだけで子テーブルもDELETEできます。
FOREIGN KEY 外部キー ON DELETE CASCADE の有無での動作確認

無駄にLOOPする必要はありません。
SQLはきちんと勉強してください。

投稿2018/07/08 00:32

Orlofsky

総合スコア16415

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

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

tomuziso

2018/07/09 02:10

回答ありがとうございます。 ON DELETE CASCADE 付きであれば、親を削除するだけで子が自動的に削除されるのですね。 勉強不足でした。こちらであれば無駄にループをする必要はありませんね。 設定しなかった場合は子を全部削除してから親を削除する方法を取ることで解決しそうですね。ありがとうございます。
tomuziso

2018/07/09 02:11

回答ありがとうございます。 ON DELETE CASCADE 付きであれば、親を削除するだけで子が自動的に削除されるのですね。 勉強不足でした。こちらであれば無駄にループをする必要はありませんね。 設定しなかった場合は子を全部削除してから親を削除する方法を取ることで解決しそうですね。ありがとうございます。
guest

0

Aテーブルに紐づくBテーブルのレコードのうち1件でも指定日数を超えたら、では既出の通りです。

Aテーブルに紐づくBテーブルの"全て"のレコードが 5日 を超えている場合に削除するSQLを作ってみました。
ON DELETE CASCADE は必要ですのでご留意ください。

sql

1DELETE FROM A 2WHERE id IN ( 3 SELECT DISTINCT t1.a_id 4 FROM 5 ( 6 SELECT a_id 7 FROM B 8 WHERE DATE_SUB(CURDATE(),INTERVAL 5 DAY) > CREATE_DATE 9 ) t1 10 LEFT OUTER JOIN ( 11 SELECT a_id 12 FROM B 13 WHERE DATE_SUB(CURDATE(),INTERVAL 5 DAY) <= CREATE_DATE 14 ) t2 15 on t1.a_id = t2.a_id 16 WHERE t2.a_id IS NULL 17);

DATE_SUB(CURDATE(),INTERVAL 5 DAY) 当日から5日前の日付を作る
t1 5日より過去に作成されたレコードの集合
t2 5日以内に作成されたレコードの集合
t1 LEFT OUTER JOIN t2t2.a_id IS NULL によって 5日より過去に作成されたレコードがあり、5日以内に作成されたレコードがない。

投稿2018/07/09 17:03

TM3tmlab

総合スコア36

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

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

0

1.Bテーブルから5日以上前のレコードを削除
2.AテーブルからBレコードが1件も紐付いていないレコードを削除

投稿2018/07/07 20:02

hichon

総合スコア5737

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

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

tomuziso

2018/07/09 02:12

Bテーブルのレコードを削除するために、Aの作成日を見てそちらから紐付いたBのレコードを削除する、という方法を取れば良さそうですね。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問