Postgresql

使用外鍵約束從 pg_dump 恢復

  • August 17, 2019

在從 恢復數據庫時pg_dump,會生成許多錯誤,隨後會忽略整個表。一個例子:

ERROR:  insert or update on table "channelproducts" violates foreign key constraint "fk_rails_dfaae373a5"
DETAIL:  Key (channel_id)=(1) is not present in table "channels".

有趣的是,我注意到所有這些實例都是由於載入順序而彈出的。channels是在channelproducts字母順序和文件之後,因此我可以理解為什麼 postgres 抱怨必須創建一個沒有父母的孩子。

警告:外鍵是由rails 4.2自動生成的:我可以從源頭上刪除問題,但這仍然不能真正解決問題……

版本:PostgreSQL 9.4.4。

psql如果已經創建了數據庫表和列, 那麼如何從外鍵約束的情況下恢復?

您可以將其放在SET session_replication_role = replica;SQL 文件的頂部。這將在數據插入期間忽略約束由於該設置是基於會話的,因此約束將繼續在此腳本之外起作用。

但請注意:如果您在此設置處於活動狀態時創建不一致的數據,postgres 將保留它們。僅在插入/更新時檢查約束。

有關此方法的優缺點的更深入討論,請參閱https://www.endpoint.com/blog/2015/01/28/postgres-sessionreplication-role 。

嘗試使用其中的空表創建新數據庫並恢復數據庫。問題可能與表之間的現有關係有關。

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