web-dev-qa-db-ja.com

ON UPDATE NO ACTIONでFK制約を選択

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';
1
Artem Dumanov

次のような「更新アクション」の場合:

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;

関連:

1