Postgresql

用新版本替換只有一個表的內容(應該禁用外鍵?)

  • January 10, 2016
  1. 我有 2 張桌子。第二個有外鍵來引用第一個。
  2. 我需要用另一個數據庫中的新版本替換第一個表的全部內容。新版本滿足所有約束和外鍵。
  3. 我需要一種通用的方法來為任何表執行此操作,因此沒有外鍵或約束或列的確切名稱可能是“硬編碼”的(但是像 pg_dump 這樣的腳本“生成”是可以的)。

我不能只截斷第一個表並插入新版本中的所有內容:pg 不允許刪除引用的行。


我嘗試像這樣使用 deferred(我計劃將其自動附加到 pg_dump 生成的 sql 中):

START TRANSACTION;

SET CONSTRAINTS ALL DEFERRED;

DELETE FROM X;

// ORIGINAL PART OF GENERATED SCRIPT
INSERT INTO X VALUES (10, ....)

COMMIT;

但我明白了Key (id)=(10) is still referenced from table

約束:

CONSTRAINT second_fkey FOREIGN KEY (X) REFERENCES first (id) MATCH SIMPLE 
ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY 

如果我以正常方式使鍵可延遲,則延遲約束解決方案(請參閱問題中的範例)實際上有效。

這不起作用,因為我做了UPDATE pg_catalog.pg_constraint SET condeferrable = true;但忘記為pg_catalog.pg_trigger.

引用自:https://dba.stackexchange.com/questions/125577