簡體   English   中英

Postgres動態更新約束外鍵

[英]Postgres dynamically update constraint foreign key

我有很多帶有許多外鍵的表,並且它們幾乎都是UPDATE NO ACTION和DELETE NO ACTION。

是否可以將所有這些外鍵動態更新為CASCADE,而不是NO ACTION或RESTRICT?

例如:

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

你的,Diogo

不,這是不可能的。

您將需要刪除並重新創建所有約束,因為不能像這樣更改外鍵約束。

以下語句將生成必要的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'

將此語句的輸出保存到文件中並運行它。

確保在運行生成的語句之前對其進行驗證!

我將使用以下代碼來生成必要的alter table SQL語句,以刪除並重新創建外鍵(按順序):

    select 'ALTER TABLE '||pgn.nspname||'.'||tbl.relname||' DROP CONSTRAINT '||cons.conname||';' as sqlstr
    from pg_constraint cons
      join pg_class tbl on cons.conrelid = tbl.oid
      join pg_namespace pgn on pgn.oid = tbl.relnamespace
    where contype = 'f' 
    union
    select 'ALTER TABLE '||pgn.nspname||'.'||tbl.relname||' ADD CONSTRAINT '||cons.conname||' FOREIGN KEY ('||(select attname from pg_attribute where attrelid=cons.conrelid and attnum = ANY(cons.conkey))||') REFERENCES '||tblf.relname||' ('||(select attname from pg_attribute where attrelid=cons.confrelid and attnum = ANY(cons.confkey))||')  ON UPDATE CASCADE ON DELETE CASCADE;'  as sqlstr
    from pg_constraint cons
      join pg_class tbl on cons.conrelid = tbl.oid
      join pg_namespace pgn on pgn.oid = tbl.relnamespace
      join pg_class tblf on cons.confrelid = tblf.oid
    where contype = 'f' 

    ORDER BY sqlstr desc

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM