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

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

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

ファイルシステムからファイル、データベースからレコードを削除することまたはメモリ内のオブジェクトの割り当てを取り消すことをさします。もしくは、HTTPプロトコルのDELETEを指すこともあります。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

2回答

7841閲覧

PostgreSQLで親テーブルと子テーブルのレコードを同時に削除したい

komekoma

総合スコア5

DELETE

ファイルシステムからファイル、データベースからレコードを削除することまたはメモリ内のオブジェクトの割り当てを取り消すことをさします。もしくは、HTTPプロトコルのDELETEを指すこともあります。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2021/10/12 02:54

前提・実現したいこと

PostgreSQLで以下のような親子関係を持っているテーブルにおいて、Aのテーブルのレコードを削除したいです。
外部キー制約がある場合、子から削除しないといけないのは理解しましたが、DELETE文でまとめて親と子を削除する方法が分かりません。
教えていただけるとありがたいです。

テーブルの親子関係

A Bの親 ↓ B Aの子でありCの親 ↓ C Bの子

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

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

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

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

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

guest

回答2

0

DELETE文でまとめて親と子を削除する方法

子は親の道連れになるように定義する。

$ psql > create table parent(id int primary key, value text); > create table child(parentId int REFERENCES parent(id) ON DELETE CASCADE, value text); > insert into parent values (1, 'aa'), (2, 'bb'); > insert into child values (1, 'xx'), (1, 'yy'), (2, 'zz'); > select * from parent; id | value ----+------- 1 | aa 2 | bb (2 rows) > select * from child; parentid | value ----------+------- 1 | xx 1 | yy 2 | zz (3 rows) > delete from parent where id = 2; > select * from parent; id | value ----+------- 1 | aa (1 row) > select * from child; parentid | value ----------+------- 1 | xx 1 | yy (2 rows)

投稿2021/10/12 03:21

shiketa

総合スコア4061

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

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

komekoma

2021/10/12 04:23

回答ありがとうございます。 まとめて削除することはできたのですが、ON DELETE CASCADE で設定する以外ではまとめて消す手段はないでしょうか?INNER JOINで結合して削除する方法を試してみましたができなかったので、、、
guest

0

ベストアンサー

参照整合性による連鎖削除の方法が取れない場合は、WITH式によって異なる操作を同時に行うことが出来ます。
7.8.2. WITH内のデータ変更文

with c_del as ( delete from c where xxxx returning * ) , b_del as ( delete from b where キー in (select 親のキー from c_del) returning * ) delete from a where キー in (select 親のキー from b_del)

投稿2021/10/12 04:25

sazi

総合スコア25327

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

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

shiketa

2021/10/12 05:15 編集

なるほど。~~勉強になります。参照整合性を外したわたしの例だとこうなりますね。with child_del as ( delete from child where parentId = 2 returning * ) delete from parent where id in (select parentId from child_del) ;~~
sazi

2021/10/12 04:51

質問では孫までいるように書かれていますが?
komekoma

2021/10/12 05:16

回答ありがとうございます! 回答を参考にして無事sqlが書けました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問