Postgresqlクエリーテーブル参照または参照されている外部キー操作
4423 ワード
今日は二つのSQLを更新します。は、PGの中で、メインテーブルの掛け布団表に引用されている外鍵を調べたり、サブテーブルにどのメインテーブルのキーが引用されていますか?
余計なことを言わないで、直接実験しなさい。
CentOS 7+PG 10
二つの実験表を作成します。test 01はメインテーブルで、test 02はサブテーブルで、test 02はtest 01の中のid列を引用します。
表の名前に基づいて、すべての外鍵を調べて、その表を参照します。また、外キーの列名も
key_コロムン.usage(システム列情報テーブル)
pg_constrant(システムのすべての制約表)
以上は個人の経験ですので、参考にしていただければと思います。間違いがあったり、完全に考えていないところがあれば、教えてください。
余計なことを言わないで、直接実験しなさい。
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)
例:以上は個人の経験ですので、参考にしていただければと思います。間違いがあったり、完全に考えていないところがあれば、教えてください。