LoginSignup
0
0

More than 1 year has passed since last update.

【PostgreSQL】参照整合性を維持するテーブルについて、CASCADEオプションを指定せずに被参照テーブルを削除したら、どうなる?

Last updated at Posted at 2022-02-03

1.環境

バージョン
Host OS Windows 10 Home 21H1(OSビルド:19043.1165)
Virtual Machine WSL2 -
Remote OS Ubuntu 20.04.2 LTS (GNU/Linux 5.4.72-microsoft-standard-WSL2 x86_64)
Database PostgreSQL 12.7 (Ubuntu 12.7-0ubuntu0.20.04.1)
Database GUI DBeaver 21.3.2.202112271055
Docker 無し -

2.疑問と答え

徹底攻略OSS-DB Silver問題集[Ver.2.0]対応』(=黒本)に、こうあった。

問19
参照制約が設定されているテーブルdummytbを削除するために、次のようなSQL文を実行した。dummytbは被参照テーブルである。
DROP TABLE dummytb CASCADE;
(黒本10章問19 解説p242)

Q:参照整合性を維持するテーブルについて、CASCADEオプションを指定せずに被参照テーブルを削除したら、どうなる?

A:エラーになり、テーブル削除できない

3.基本知識整理

・参照制約
緑本で言う「外部キー制約/参照整合性制約」(緑本p225)のことかな。
緑本には被参照テーブルの列を削除/更新する方法は解説されているけれど、被参照テーブルを削除する方法は記載されていない。

・被参照テーブルの列を削除/更新
① エラーにさせる方法(被参照テーブルのデータは変更させない)
② 被参照テーブルの列を削除/更新すると同時に、参照テーブルのデータも削除/更新してしまう方法
の2つを選択できる。デフォルトは「①」。
(参考:緑本p227)

・被参照テーブルを削除
DROP TABLE実行時にCASCADEオプションを指定することで、参照制約が削除される。(本問の解答)

4.試してみる

疑問:CASCADEオプションを指定しなかった場合、エラーになるのか?

試す:WSL2でサンプルデータを動かし、試してみる!

サンプルのテーブルを作る。(参考:緑本p226)

PostgreSQL_(DBeaver_VSCode_WSL2(Ubuntu))
CREATE TABLE master ( id int PRIMARY KEY); ←被参照テーブル(id列=主キー)
CREATE TABLE tbl ( id int REFERENCES master(id)); ←参照テーブル(masterテーブルのid列を外部キーとする)
insert into master values (1); 
insert into tbl VALUES(1);

参照制約をもつテーブルが出来上がった。

(疑問:DVBeaverの操作について。上記4文は1文1文実行していった。
4文全体を選択して全てを連続して実行する方法は無いか探してみたが、見つけられず。
ひとつのSQLエディタ内に書かれているSQL全てを連続して実行する方法(Alt+X)は見つかったのだが・・・。)

次に、
①CASCADE オプションを付けてDROP
②CASCADEオプション付けずにDROP
の2通りの方法を試し、挙動を確認する。

①CASCADE オプションを付けて被参照テーブルをDROP(問題文の方法)

PostgreSQL_(DBeaver_VSCode_WSL2(Ubuntu))
DROP TABLE master CASCADE; 

実行結果↓ DROP TABLEできた!
無題.png

②を試すためにtblテーブルも削除しておく。
DROP TABLE tbl; 
その後もう一度masterテーブルとtblテーブルを前回と同じ条件で作成しておく。

②CASCADEオプション付けずに被参照テーブルをDROP

PostgreSQL_(DBeaver_VSCode_WSL2(Ubuntu))
DROP TABLE master; 

実行結果↓ エラーになった!
1000.png

【エラー文】
SQLエラー [2BP01]: ERROR: cannot drop table master because other objects depend on it
詳細: constraint tbl_id_fkey on table tbl depends on table master
ヒント: Use DROP ... CASCADE to drop the dependent objects too.

依存しているからDROP TABLEできませんよ、とのこと。
ヒントでもCASCADEを使うように勧めている。

エラーになり、DROP TABLEできなくなることがわかった。解決!
改めてmasterテーブルとtblテーブルを削除しておき、完了。

未解決の疑問

(GUIの操作)DBeaverで複数のSQLを選択して連続して実行する方法はあるのか?

DBeaverの操作について。
今回複数(4文)のSQLを実行する際、1文1文実行していった。
4行全体を選択して全てを連続して実行する方法が知りたい。

(ひとつのSQLエディタ内に書かれているSQL全てを連続して実行する方法(Alt+X)は見つかったのだが…。)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0