3

私は多くの外部キーを持つテーブルをたくさん持っており、それらのほぼすべてが UPDATE NO ACTION と DELETE NO ACTION です。

このすべての外部キーを NO ACTION または RESTRICT ではなく CASCADE に動的に更新することは可能ですか?

例えば:

ALTER TABLE * ALTER FOREIGN KEY * SET ON UPDATE CASCADE ON DELETE CASCADE;

さようなら、ディオゴ

4

2 に答える 2

6

いいえ、これは不可能です。

外部キー制約はそのように変更できないため、すべての制約を削除して再作成する必要があります。

次のステートメントは、外部キーを削除して再作成するために必要な 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'

このステートメントの出力をファイルに保存して実行します。

実行する前に、生成されたステートメントを必ず検証してください。

于 2012-05-30T12:37:32.217 に答える