Postgres 9.5を使用しています。
このスクリプトを変更して、このテーブルの各外部キー参照のON UPDATE
アクションを表示することはできますか?または、この値をどうにかして取得しますか?
SELECT
tc.table_schema,
tc.constraint_name,
tc.table_name,
kcu.column_name,
ccu.table_schema AS foreign_table_schema,
ccu.table_name AS foreign_table_name,
ccu.column_name AS foreign_column_name
FROM
information_schema.table_constraints AS tc
JOIN information_schema.key_column_usage AS kcu
ON tc.constraint_name = kcu.constraint_name
AND tc.table_schema = kcu.table_schema
JOIN information_schema.constraint_column_usage AS ccu
ON ccu.constraint_name = tc.constraint_name
AND ccu.table_schema = tc.table_schema
WHERE constraint_type = 'FOREIGN KEY';
次のような「更新アクション」の場合:
FOREIGN KEY (foo_id) REFERENCES foo(foo_id) ON UPDATE CASCADE ON DELETE CASCADE
FOREIGN KEY (foo_id) REFERENCES foo(foo_id) ON UPDATE DELETE ON DELETE CASCADE
FOREIGN KEY (foo_id) REFERENCES foo(foo_id) ON UPDATE NO ACTION ON DELETE CASCADE
等.
..システムカタログテーブルpg_constraint
を調べます。保持する列confupdtype
が含まれています マニュアルによると :
外部キー更新アクションコード:
a
=アクションなし、r
=制限、c
=カスケード、n
= nullを設定、d
=デフォルトに設定
ON UPDATE NO ACTION
が指定されたテーブルを指すすべてのFK制約を検索します(タイトル内の質問):
SELECT conrelid::regclass AS table_from
, conname AS constraint_name
, pg_get_constraintdef(oid) AS constraint_def
FROM pg_constraint
WHERE contype = 'f'
AND confupdtype = 'n'
AND confrelid = 'public.target_table'::regclass -- target table here
ORDER BY 1;
DB内のすべてのFK制約を検査します。
SELECT conrelid::regclass AS table_from
, conname AS constraint_name
, pg_get_constraintdef(oid) AS constraint_def
, CASE confupdtype
WHEN 'a' THEN 'NO ACTION'
WHEN 'r' THEN 'RESTRICT'
WHEN 'c' THEN 'CASCADE'
WHEN 'n' THEN 'SET NULL'
WHEN 'd' THEN 'SET DEFAULT'
ELSE 'WARNING: unexpected value!'
END AS fk_update_action
FROM pg_constraint
WHERE contype = 'f'
ORDER BY 1;
関連: