postgresql 中缺少行的數據庫,如何用備份副本填充缺少的行?
我有一個大問題,我對 postgresql 不是很好,因為我使用 Django 進行查詢,而且我只有 sql 的基礎知識來進行查詢。
我的問題是有一個問題,超級使用者刪除了一個與我的表“客戶”相關的欄位(我不知道她是怎麼做到的,我沒有設計系統,我只是管理它),所以大約有 120 個客戶端從表中消失,我從昨天開始進行備份(我知道備份的重要性),我想將所有數據從備份“複製”到缺少行的數據庫中。
我試圖只從 pgadmin 恢復表(簡單的方法),但它說“重複的鍵值違反了唯一約束”user_client_pkey”,詳細資訊:Key(id) = 461 已經存在。所以我猜我無法恢復,因為有些值與確切的 id 匹配,有沒有簡單的方法(或程序)可以複製失去的行,只給出 id 並填充我備份中的數據?
比較行之類的東西,如果沒有具有該ID的行,則將數據插入那裡?我知道這不是一個簡單的查詢,但任何幫助都會很棒。我確信最簡單的方法是回滾、刪除數據庫並恢復,但是有很多表包含更多資訊,而客戶端是唯一真正需要恢復的表。
我嘗試創建一個新表並從備份中恢復數據,但它沒有填充(可能是因為它與新表的名稱不匹配),我還用失去的行更改了表的名稱並創建一個新表並從備份中恢復,但是 pk 失去了,我收到了這個錯誤:
我更改了表客戶的原始,然後我創建了一個新表並將其命名為原始表,恢復數據庫,它填充,但給了我這個錯誤:
由於表 public.“admin_clienteB” 沒有主鍵或 OID,因此您只能查看數據。沒有主鍵的編輯數據工具無法插入新行和更改現有行。
任何幫助都會很棒。
您可以將所有受影響的表恢復到不同的模式中,有多種方法可以做到這一點(https://stackoverflow.com/questions/4191653/i-want-to-restore-the-中的幾個好主意具有不同模式的數據庫)。
一旦表處於單獨的模式中,您可以按主鍵比較它們,並插入缺少的,就像每個受影響的表一樣:
INSERT INTO production.table SELECT b.* FROM backup.table b LEFT JOIN production.table p ON (p.pkey = b.pkey) WHERE p.pkey IS NULL;
您只需要找出受影響表的列表,在單獨的模式中恢復它們的備份,確定它們的主鍵是什麼,使用插入創建腳本並執行它。