Postgresqlクエリーテーブル参照または参照されている外部キー操作


今日は二つのSQLを更新します。は、PGの中で、メインテーブルの掛け布団表に引用されている外鍵を調べたり、サブテーブルにどのメインテーブルのキーが引用されていますか?
余計なことを言わないで、直接実験しなさい。
CentOS 7+PG 10
二つの実験表を作成します。test 01はメインテーブルで、test 02はサブテーブルで、test 02はtest 01の中のid列を引用します。

test=# create table test01(
test(# id int primary key,
test(# col1 varchar(20)
test(# );
CREATE TABLE
 
test=# create table test02(
test(# id int primary key,
test(# test01_id int references test01(id),
test(# col1 varchar(20)
test(# );
CREATE TABLE
データの挿入

test=# insert into test01 values (1, 'a');
INSERT 0 1
test=# insert into test01 values (2, 'b');
INSERT 0 1
test=# insert into test01 values (3, 'c');
INSERT 0 1
test=# insert into test02 values (1, 1, 'a');
INSERT 0 1
test=# insert into test02 values (2, 1, 'a');
INSERT 0 1
test=# insert into test02 values (3, 1, 'a');
INSERT 0 1
test=# insert into test02 values (4, 2, 'b');
INSERT 0 1
test=# insert into test02 values (5, 2, 'b');
INSERT 0 1
test=# insert into test02 values (6, 11, 'b');
ERROR: insert or update on table "test02" violates foreign key constraint "test02_test01_id_fkey"
DETAIL: Key (test01_id)=(11) is not present in table "test01".
メインテーブルがどのサブテーブルで参照されているかを確認します。結果が空であれば、サブテーブルの参照がないことを説明します。

test=# SELECT
tc.constraint_name,
tc.table_name, #   
kcu.column_name,
ccu.table_name AS foreign_table_name, #   
ccu.column_name AS foreign_column_name,
tc.is_deferrable,
tc.initially_deferred
FROM
information_schema.table_constraints AS tc
JOIN information_schema.key_column_usage AS kcu ON tc.constraint_name = kcu.constraint_name
JOIN information_schema.constraint_column_usage AS ccu ON ccu.constraint_name = tc.constraint_name
where constraint_type = 'FOREIGN KEY' AND ccu.table_name='test01'; #     
constraint_name | table_name | column_name | foreign_table_name | foreign_column_name | is_deferrable | initially_deferred
-----------------------+------------+-------------+--------------------+---------------------+---------------+--------------------
test02_test01_id_fkey | test02 | test01_id | test01 | id | NO | NO
(1 row)
サブテーブルの参照先を調べます。結果が空の場合は、メインテーブルを参照していないことを説明します。

test=# SELECT
tc.constraint_name,
tc.table_name, #   
kcu.column_name,
ccu.table_name AS foreign_table_name,
ccu.column_name AS foreign_column_name, #   
tc.is_deferrable,
tc.initially_deferred
FROM
information_schema.table_constraints AS tc
JOIN information_schema.key_column_usage AS kcu ON tc.constraint_name = kcu.constraint_name
JOIN information_schema.constraint_column_usage AS ccu ON ccu.constraint_name = tc.constraint_name
WHERE constraint_type = 'FOREIGN KEY' AND tc.table_name='test02'; #     
constraint_name | table_name | column_name | foreign_table_name | foreign_column_name | is_deferrable | initially_deferred
-----------------------+------------+-------------+--------------------+---------------------+---------------+--------------------
test02_test01_id_fkey | test02 | test01_id | test01 | id | NO | NO
(1 row)
追加:PostgreSQL外部キー参照クエリ
表の名前に基づいて、すべての外鍵を調べて、その表を参照します。また、外キーの列名も
key_コロムン.usage(システム列情報テーブル)
pg_constrant(システムのすべての制約表)

SELECT x.table_name,
    x.column_name
 FROM information_schema.key_column_usage x
 INNER JOIN (SELECT t.relname, 
            a.conname 
         FROM pg_constraint a 
         INNER JOIN pg_class ft
             ON ft.oid = a.confrelid 
         INNER JOIN pg_class t 
             ON t.oid = a.conrelid
        WHERE a.contype = 'f' 
         AND a.confrelid =
            (select e.oid 
             from pg_class e
             where e.relname = 'xxx_table')
        ) tp 
     ON (x.table_name = tp.relname AND
       x.constraint_name = tp.conname)
例:

以上は個人の経験ですので、参考にしていただければと思います。間違いがあったり、完全に考えていないところがあれば、教えてください。