私は多くの外部キーを持つテーブルをたくさん持っており、それらのほぼすべてが UPDATE NO ACTION と DELETE NO ACTION です。
このすべての外部キーを NO ACTION または RESTRICT ではなく CASCADE に動的に更新することは可能ですか?
例えば:
ALTER TABLE * ALTER FOREIGN KEY * SET ON UPDATE CASCADE ON DELETE CASCADE;
さようなら、ディオゴ
私は多くの外部キーを持つテーブルをたくさん持っており、それらのほぼすべてが UPDATE NO ACTION と DELETE NO ACTION です。
このすべての外部キーを NO ACTION または RESTRICT ではなく CASCADE に動的に更新することは可能ですか?
例えば:
ALTER TABLE * ALTER FOREIGN KEY * SET ON UPDATE CASCADE ON DELETE CASCADE;
さようなら、ディオゴ
いいえ、これは不可能です。
外部キー制約はそのように変更できないため、すべての制約を削除して再作成する必要があります。
次のステートメントは、外部キーを削除して再作成するために必要な alter table ステートメントを生成します。
select 'alter table '||pgn.nspname||'.'||tbl.relname||' drop constraint '||cons.conname||';'
from pg_constraint cons
join pg_class tbl on cons.confrelid = tbl.oid
join pg_namespace pgn on pgn.oid = tbl.relnamespace
where contype = 'f'
union all
select 'alter table '||pgn.nspname||'.'||tbl.relname||' add constraint '||cons.conname||' '||pg_get_constraintdef(cons.oid, true)||' ON UPDATE CASCADE ON DELETE CASCADE;'
from pg_constraint cons
join pg_class tbl on cons.confrelid = tbl.oid
join pg_namespace pgn on pgn.oid = tbl.relnamespace
where contype = 'f'
このステートメントの出力をファイルに保存して実行します。